Jimmy那些事儿

R_导入&导出

Windows下路径要用斜杠/或者双反斜杠\\

R本身把\ 当做转义符,所以写pattern的时候要用\\进行转义


获取文件目录信息

目录操作

getwd & setwd

  • getwd():获得当前工作目录
  • setwd()设置当前工作目录 setwd("C:/data")


dir & list.files - 获取

dir 与 list.files 功能相同;列出当前目录中所有的文件

  • dir() :列出当前目录中所有的文件名
  • dir(path=”/home/conan/R”, pattern=Null, all.files=False, full.names=Fasle, recursice=Fasle, igonre.case= False, include.dirs=False, no..=False):查看指定目录的文件

path:查看指定路径下的文件。

pattern :匹配的正则表达式模式

all.files = False(默认) ;若为True,则列出隐藏的文件名

full.names=False(默认) "我的形状";若为True,列出含相对路径的文件名 "./我的形状"

1
dir(path="/home/conan/R",pattern='txt$')


choose.dir - 获取

通过选取的方式获得目录

1
a <- choose.dir()


system(“tree”) - 获取

通过系统命令以树状结构查看目录结构

  • file.info()


dir.create - 新建

  • dir.create():在当前目录下,新建一个目录
  • dir.create(path=”a1/b2/c3”,recursive = TRUE):创建一个3级子目录./a1/b2/c3


file.path - 合并

  • file.path(…, fsep = .Platform$file.sep)
    • file.path(getwd(), dir()) :当前工作目录下的文件的路径

… : 字符串

fsep : 用于使用的路径分隔符

1
2
3
4
5
6
> file.path("C:\\Users\\long\\Desktop","txt")
[1] "C:\\Users\\long\\Desktop/txt"
#----------------------------------------#
> file.path(getwd(),dir())
[1] 'E:/Jupyter_notebook/test' 'E:/Jupyter_notebook/test.ipynb' 'E:/Jupyter_notebook/专项分析'

一般用paste来生成系统路径的时候,在最终结果,结合的地方会多一个空格,当然也可以用去空格的方式排除,但是不够好。

用file.path的方式直接生成,比较方便,而且绝对正确。


几个特殊的目录

  • R.home() 查看R软件的相关目录
  • .Library 查看R核心包的目录
  • .Library.site 查看R核心包的目录和root用户安装包目录
  • .libPaths() 查看R所有包的存放目录
  • system.file() 查看指定包所在的目录


文件操作


file.exist - 存在

判断文件是否存在

1
2
3
4
5
6
7
8
> file.exists(".")
[1] TRUE
> file.exists("./a1/b2")
[1] TRUE
# 目录不存在
> file.exists("./aa")
[1] FALSE


file.remove - 删除

删除某目录


file.create - 创建

创建文件

1
2
3
4
5
6
7
8
9
# 创建一个空文件 A.txt
> file.create("A.txt")
[1] TRUE
# 创建一个有内容的文件 B.txt
> cat("file B\n", file = "B.txt") # 把字符串输出到file
# 打印B.txt
> readLines("B.txt")
[1] "file B"


file.copy - 复制

1
2
> file.copy("A.txt", "C.txt")
[1] TRUE


file.append


file.rename - 重命名

对文件重命名

  • file.rename(“old_name”, “new_name”):将old_name变更为new_name


压缩与解压

unzip(),zip() 两个函数,可以压缩和解压缩


导入


导入 - 数据表

  1. 要导入的数据必须存放在getwd()目录下
  2. Windows下路径要用斜杠/或者双反斜杠\\


readr

library(readr)

  • read_delim(“filename.xxx”, delim=””) : 自由分隔符
    • delim= "|"或其他任何形式
  • read_csv(“filename.csv”, col_names=T, col_types=NULL, skip = 0, locale(), na=c(“”,”NA”)):分隔符-逗号

col_names = True(默认) / False 或者 c(“”,””) 指定的 [向量]列名

col_types = cols(colname=colcharacter() ) / cols(colename= “c”, colname=”“) :指定某个列的类型;

  • 可以使用简写 each character represents one column: c = character, i = integer, n = number, d = double, l = logical, D = date, T = date time, t = time, ? = guess, or _/- to skip the column.
  • cols(colname=col_skip() ) 跳过某个列不进行选取;

skip = n 跳过的行数

locale= locale(encoding=”UTF-8”, date_format=”%AD”,time_format=”%AT”) (默认为US-centric)

  • encoding=”UTF-8” / “gb2312”

na = c(“”, “NA”) :设置 """NA" 显示为NA;也可自定义

  • read_tsv():制表符
  • read_csv2():分号
  • read_table()
  • read_fwf()


readxl

.xls和.xlsx格式的Excel工作表

  • read_excel(path, sheet = NULL, range = NULL, col_names = TRUE, col_types = NULL, na = “”, trim_ws = TRUE, skip = 0, n_max = Inf, guess_max = min(1000, n_max)) :读取xls/xlsx的工作表

path:Path to the xls/xlsx file

sheet:Sheet to read;整数或者字符串

range:读取的范围,例如 “B3:D87”

col_names:True/Fasle,或者输入自定义的列名,长度需要与col_types相同

col_types:

na = “ ”:默认将空格视为NULL

skip=0:跳过行数;若给定了range则忽略

  • excel_sheet(path) :显示表中的sheet名称


导入 - 非表格式

非表格式的(Non-Tabular);这里的文本文件指的是非表格式的文件,如纯文本文件,html文件


readr

  • read_file(file, locale=default_locale()):读入为一个单一的字符串

file : 文档路径,一个连接或一个文本数据

  • Files ending in .gz, .bz2, .xz, or .zip 将自动被解压
  • Files starting with http://, https://, ftp://, or ftps:// 将自动被下载
  • Remote gz files 也能被自动下载

locale=locale() : 默认为US-centric

  • read_file_raw(file):读入为一个未加工的向量
  • read_lines(file, skip=0, n_max=-1L, locale=default_locale(), na=character(), progress=interactive())逐行读入,每一行作为一个单一的字符串
  • read_lines_raw():逐行读入,每一行作为一个未加工的向量
  • read_log(file, col_names=FALSE, col_types=NULL, skip=0, n_max=-1L):读入日志文档


scan

  • scan(“file.xxx”, what=double(), seq=””, n=-1, nmax=-1, skip=0, encoding=”UTF-8”)

    读取文本文件,默认情况下读取文件中以[空格分割] 所有[浮点数值]

    • 如果文件中包含非数值,可以字符串形式读入 scan("a.txt",what="")
    • 指定分隔符为换行,scan(“a.txt”,what=””,sep=”\n”) 返回以换行分割的字符串向量
    • 如果数据为表格形式:因为有表头,用scan不能读入

what:读入的数据类型;The supported types are [ logical, integer, numeric, complex, character, raw and list. ]

  • character(0):每个单词作为字符向量的一个元素

sep:分隔符,默认为空格" "

n = -1:显示至最后一行

nmax = -1:读取至最后一行

skip=0:跳过的行数

encoding=”UTF-8” / “Latin1”

quote =’’ : 若提示 EOF within quoted string可将quote = ''




readline

可以从键盘读取单行数据

1
age<-readline("input the age: ")


readLines

  • readLines(“file.xxx”, encoding=”UTF-8”)每一行当做一个字符串。等价于scan中指定分隔符为换行
    • 用于读取字符型的格式文件;常用于文本文件

encoding = “UTF-8” / “Latin1” ; Lattin1是[ISO-8859-1]的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII


导出


导出 - 数据表

readr

  • write_delim(x, path, delim = “ “, na = “NA”, append = FALSE, col_names = !append) :默认分隔符为 " "
  • write_csv(x, path, na = “NA”, append = FALSE, col_names = !append) :导出为逗号分隔符的文档

x :要导出的对象

path:Path or connection to write to.

append=False (默认), 覆盖已有的文件;若为True,增加已经存在的文件

col_names = !append 写入的时候不写入列名

  • write_tsv() :分隔符为制表符\t
  • write_excel_csv():导出为csv文档

All columns are encoded as UTF-8


Basic

  • write.table
  • write.csv()


导出 - 文本&文本文件

readr

  • write_file(x, path):导出为字符串文档

  • write_lines():导出为字符串向量,每一个元素一行

  • write_rds():导出为RDS文档


cat

  • cat(x, file=””, sep=””, fill=False, labels=NULL, append=False)
    • 拼接后输出对象
    • 把结果写到指定的文件中

x:R的对象

file:一个连接,或命名的文件打印到一个字符串;默认情况下打印到标准输出连接

sep=” “:默认为空格; 每个元素后追加一个字符串的字符向量;

append = False 覆盖file内容;若为True,表示附加到file

1
2
3
4
5
6
> cat(c("AB", "C"), c("E", "F"), "\n", sep="")
[1] ABCDEF
#----可以把结果写到指定的文件中-----------------#
cat("i = ", 1, "\n", file="c:/work/result.txt")
# 加上一个append=TRUE参数可以不覆盖原文 件而是在文件末尾附加,这很适用于运行中的结果记录。


cat vs. paste

  • cat是输出,paste连接成一个字符串
    • 显示结果是:一个没有引号的结果(cat),另一个是有引号的字符串(paste)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
a<-c(1,2,3,4)
b<-c(4,5,6,7)
c<-c('hi','hello')
> paste(a,b,c)
[1] "1 4 hi" "2 5 hello" "3 6 hi" "4 7 hello"
> cat(a,b,c)
1 2 3 4 4 5 6 7 hi hello
> cat(LETTERS, letters)
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
> paste(LETTERS, letters)
[1] "A a" "B b" "C c" "D d" "E e" "F f" "G g" "H h" "I i" "J j" "K k" "L l"
[13] "M m" "N n" "O o" "P p" "Q q" "R r" "S s" "T t" "U u" "V v" "W w" "X x"
[25] "Y y" "Z z"


cat vs. print

  • cat被认为是更低级别的print,会识别转义符并进行执行
1
2
3
4
5
6
7
> x <- "a b\tc\nd"
> print(x)
[1] "a b\tc\nd"
> cat(x)
a b c
d


writeLines


案例 - 获取指定目录下的csv文档,并合并输出

  • Windows下路径要用斜杠/或者双反斜杠\\
1
2
3
4
5
6
7
8
# 设定指定的路径
path_data_source <- c("E:\\my_computer\\1_工作学习\\10_工作文档\\5 银天下-数据分析\\21_查询结果\\2 日报统计\\0712_千股期谈\\数据源_后台数据")
# 获取该路径下的文件名,特定的文件名
filename <- dir(path_data_source, pattern="webcast-stat-.*\\.csv$")
# 把文件名与路径组合在一起
path_filename <- file.path(path_data_source, filename)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#----获取指定目录下的csv文档,并合并输出----------#
## 获取当前工作目录下所有文件名的路径
file.path(getwd(),dir())
'E:/Jupyter_notebook/test' 'E:/Jupyter_notebook/test.ipynb' 'E:/Jupyter_notebook/专项分析'
path <- file.path(getwd(),dir())[1]
'E:/Jupyter_notebook/test'
## 获取该路径下的所有csv文件名
name <- dir(path, pattern=".*\\.csv$"); name
'2016-01-11-IC_1.csv' '2016-01-11-IH_1.csv' '2016-01-12-TF_1.csv' '2016-01-13-T_1.csv'
## 合并文件名路径 + 文件名
path_name <- file.path(path, name); path_name
## 省去定义data.frame的时间,我选择先读入一个文件
table0 <- read_csv(path_name[1], locale=locale(encoding='gb2312'))
## 写循环写入该文件中
for (i in path_name[2:length(paht_name)]){ # 大括号表示代码块的起止
table1 <- read_csv(path_name[1], locale=locale(encoding='gb2312'))
table0 <- bind_rows(table0, talbe1)
}
## 写出文档
write_csv(table0, file.path(path, 'test.csv'), append=F)