R语言七天入门教程六:文件相关操作
一、文件的读写
R 语言作为统计学编程语言,常常需要处理大量数据,而这些数据通常会从文件中进行读取,因此文件读写在R语言中是非常重要的操作。在R语言中,用到最多的文件格式是csv文件。
1、文本文件
- 文本文件也就是txt文件,按行读取用
readLines
函数,函数声明如下:
readLines(con = stdin(), n = -1L, ok = TRUE, warn = TRUE, encoding = "unknown", skipNul = FALSE)
con参数用于指定文件路径,n用于指定一共读取多少行,encoding指定编码格式。
例如,文本文件file.txt
内容如下:
This a txt file.
"Hello world" is the second line.
This is the end of the file.
读取的代码如下所示:
file1 = readLines('file.txt') # 读取所有行
print(file1)
file2 = readLines('file.txt',n=2) # 读取前2行
print(file2)
运行结果如下:
注意:file.txt应该放在当前的工作目录(working directory)下,在R语言中可以通过getwd()
函数来查看当前的工作目录,setwd()
函数来设置当前的工作目录。这里传入的文件路径’file.txt’是相对路径,只会在当前工作目录下查找。关于相对路径和绝对路径,简单理解就是:相对路径是文件相对于当前目录的路径,绝对路径是文件在操作系统中完整的文件路径。更多内容,可以参考相对路径和绝对路径。
在R Studio中,我们可以通过如下方式来快速在当前目录新建文本文件,填写相关内容后,保存为file.txt即可:
- 与之对应的,写入txt文件使用
writeLines()
函数,其函数声明如下:
writeLines(text, con = stdout(), sep = "\n", useBytes = FALSE)
text参数用于指定要写入的内容,con指定写入文件的路径,sep参数指定每行结束后的分隔符。'\n’是转义字符,含义是换行符。对于转义字符,简单理解为就是带有右划线的字符,右划线和它后面的字符会被解释为一个新的特殊字符。例如,\n表示换行,\r表示回车。更多内容,可参考字符串转义字符。
程序例子如下:
writeLines('Write a new line in file.txt', 'file.txt')
# 写入新内容之后,重新读取并查看file.txt的内容
file = readLines('file.txt') # 读取所有行
print(file)
结果如下:
可以看到writeLines()
函数是覆盖写入,新的内容会覆盖旧的内容。
2、csv文件
- csv文件本质上也是文本文件,每一行数据的不同列用分隔符(例如,逗号,分号,空格等)分隔。可以通过函数
read.table()
、read.csv()
、read.csv2()
读取,读取结果均以数据框格式存储。他们的区别主要在于默认的分隔符不同,read.csv
中默认的分隔符为逗号,
,read.table
中默认的分隔符为空格,read.csv2
中默认的分隔符为分号;
。也可以通过指定sep参数改变默认的分隔符,因而这几个函数之间可以相互替代使用。此外,这三个函数也可以用于读取Table格式的文本文件。这三个函数的参数非常多,我们重点关注如下几个即可。
参数名 | 含义 |
---|---|
file | 要读取的文件 |
header | 是否将文件的第一行作为列名,对于read.csv() 和read.csv2() 默认为TRUE,read.table() 默认为FALSE |
sep | 文件中不同列的分隔符 |
row.names | 每一行的名称,应为向量 |
col.names | 每一列的名称,应为向量 |
nrows | 最多读取多少行 |
例如,有如下txt文件file.txt:
1 lisan man 18
2 liyier man 19
3 liyiersan man 20
如下csv文件file.csv:
id,keyword,url
1,baidu,www.baidu.com
2,tencent,www.tencent.com
3,google,www.google.com
程序例子如下:
data_frame1 = read.table('file.txt',col.names=c('id','name','sex','age'))
data_frame2 = read.csv('file.csv',nrows=3) # header不计入nrows
print(data_frame1)
print(data_frame2)
结果如下:
注意:文件的最后一行需要保留一个空行,不然会有警告。警告可以忽略,程序仍可以正常运行,但是为了美观,最好保留一个空行。file.txt中最后有空行,所以无警告信息。
- 由于读取到的是一个数据框类型,所以可以对读取到的数据进行修改,查询等操作。也可以将更新后的数据框保存到新的文件中,对应函数是
write.table()
、write.csv()
、write.csv2()
。参数含义如下:
参数名 | 含义 |
---|---|
x | 待写入的内容,通常为数据框或者矩阵 |
file | 待写入的文件 |
append | 是否以追加的形式写入,默认为FALSE。追加就是添加到新文件的末尾,否则就是覆盖写入。 |
quote | 字符串类型和因子数据是否用“”括起来,默认为TRUE |
sep | 每一列的分隔符 |
eol | 每一行的结尾字符 |
row.names | 是否存储行名,默认为TRUE,在保存时,我们通常不希望存储行名 |
col.names | 是否存储列名,默认为TRUE,在保存时,我们通常存储列名 |
程序例子如下:
data_frame = read.csv('file.csv')
print(data_frame)
# 添加新的第4行数据
# 数据框的每一行依旧是数据框,所以添加时,要传入一个子数据框
data_frame[4,] = data.frame(4,'alibaba','www.alibaba.com.cn')
write.csv(data_frame,'file.csv',row.names=FALSE) # 不存储行名
# 写入完成后,重新读取csv文件查看内容
data_frame = read.csv('file.csv')
print(data_frame)
结果为:
此时,用记事本打开file.csv文件发现,字符串数据都被""括起来了。
3、Excel文件
R语言读写excel文件需要下载xlsx库,由于excel文件中的 xls和xlsx格式,可以直接转换为csv格式,所以可以直接通过 CSV 与 R 交互,没必要再使用 Excel。
安装xlsx库,应使用install.packages()
函数,代码如下:
# 先安装Rtools,再安装xlsx
install.packages('installr', repos = "https://mirrors.ustc.edu.cn/CRAN/")
library(installr) # 导入installr库
install.Rtools() # 使用installr安装Rtools
install.packages("xlsx", repos = "https://mirrors.ustc.edu.cn/CRAN/")
repos参数用于指定下载镜像,此处使用中科大的镜像。
安装完成之后,对于excel文件file.xlsx:
读取代码如下:
library("xlsx") # 先导入库
data = read.xlsx("file.xlsx", sheetIndex = 1) # 读取一个xlsx文件,sheetIndex是工作簿序号
print(data)
运行结果如下:
二、文件和目录操作
在编码时,常常需要对文件和目录进行操作,例如,复制、移动、重命名等。常用的函数如下:
1、工作目录
工作目录(working directory)通常是当前项目所在位置,可以使用getwd()
函数查看工作目录,使用setwd()
设置目录。
程序例子如下:
getwd()
setwd('C:/Users/alex/Documents') # 设置工作目录为:C:/Users/alex/Documents
getwd() # 查看更改后的工作目录
结果如下:
2、判断是否存在
dir.exists()
和file.exists()
函数分别用于判断目录和文件是否存在。传入的参数可以是单一路径,也可以是一个向量,用于批量判断文件是否存在。
例如,当前工作目录为C:/Users/alex/Desktop/R demos,目录中文件如下:
程序例子如下:
dir.exists('test') # 判断当前工作目录下是否存在子目录test1
# 判断当前电脑中是否存在绝对目录C:/Users/alex/Documents,和当前工作目录下是否存在子目录test2
dir.exists(c('C:/Users/alex/Documents','test2'))
# 判断当前工作目录下是否存在文件file.txt
file.exists('file.txt')
# 判断C:/Users/alex/Desktop/R demos目录下是否存在文件file.csv,和工作目录下是否存在文件file.xlsx
file.exists(c('C:/Users/alex/Desktop/R demos/file.csv','file.xlsx'))
结果如下:
3、新建
dir.create()
函数用于新建目录,声明如下:
dir.create(path, showWarnings = TRUE, recursive = FALSE, mode = "0777")
各参数含义如下(重点关注path和recursive这两个参数即可):
path参数用于指定新建的目录的路径,可以是一个字符串。
recursive参数用于指定是否创建多级目录,默认为FALSE,即只新建path中的第一级子目录,而当recursive为TRUE时,可以新建多级子目录。
当目录已存在时不会新建目录覆盖原先的目录,此时如果showWarnings为TRUE,则会提醒该目录已存在,为FALSE时不会提醒。
mode用于指定目录的权限,可参考Linux权限详解。
file.create()
函数用于新建文件,如果创建成功,会返回TRUE,否则返回FALSE,声明如下:
file.create(..., showWarnings = TRUE)
程序例子如下:
dir.create('test_dir/test_subdir', recursive = TRUE) # 创建多级目录
dir.create('test1') # 创建目录test1
file.create(c('new_file1.txt', 'new_file2.txt')) # 创建两个txt文件
# 上述采用的是相对路径,都只会在当前工作目录下创建
结果如下:
此时,查看工作目录,会发现多了两个目录和新文件:
4、重命名
file.rename()
用于重命名文件或目录,也具有返回值(TRUE/FALSE),函数声明如下:
file.rename(from, to)
from参数是原始文件(目录)名,to是新文件(目录)名,二者可以是向量,但是长度需相同。
程序例子如下:
file.rename('file.txt','new_file.txt') # 将文件file.txt重命名为new_file.txt
file.rename(from='test1',to='new_test1') # 将目录test1重命名为new_test1
结果如下:
此时,查看工作目录,会发现文件和目录名称发生了变化:
5、删除
file.remove()
函数用于删除文件(有返回值),unlink()
函数可以用来删除文件或目录,函数声明如下:
file.remove(...)
unlink(x, recursive = FALSE, force = FALSE, expand = TRUE)
x是要删除的文件或目录,可以是向量(即批量删除);当删除目录时,recursive应为TRUE,表示目录内文件和子目录一并删除;force表示是否强制删除。
程序例子如下:
file.remove('file.xlsx', 'new_file.txt') # 删除文件file.xlsx和文件new_file.txt
unlinke('test_dir', recursive = TRUE) # 删除目录test_dir
结果如下:
此时查看工作目录,可以发现相应文件和目录已经被删除:
6、复制
file.copy()
函数用于复制文件或目录,同样具有返回值,其声明如下:
file.copy(from, to, overwrite = recursive, recursive = FALSE, copy.mode = TRUE, copy.date = FALSE)
各参数含义如下(重点关注前四个参数即可):
from是原始文件(目录)名,to是新文件(目录)名,二者可以是向量,但是长度需相同;
overwrite 表示是否覆盖文件,默认与recursive值一致,若为TRUE,则文件被覆盖;
recursive 表示是否复制目录下的文件和子目录,复制目录时recursive需为TRUE;
copy.mode表示是否复制文件权限信息,默认为TRUE;
copy.date表示是否复制文件日期信息,默认为FALSE。
程序例子如下:
file.copy('file.csv','new_test1') # 将file.csv文件复制到new_test1目录
dir.create('new_test2') # 新建目录new_test2
file.copy('new_test1','new_test2', recursive=TRUE) # 将目录new_test1复制到new_test2
结果如下:
此时查看工作目录,如下:
7、遍历
如果我们要列出一个目录下的所有文件和目录,可以使用list.files()
函数,如果只需要列出子目录,可以使用list.dirs()
函数。list.files()
函数有个别名是dir()
,dir()
和list.files()
用法完全一样。函数声明如下:
list.files(path = ".", pattern = NULL, all.files = FALSE,
full.names = FALSE, recursive = FALSE,
ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE)
list.dirs(path = ".", full.names = TRUE, recursive = TRUE)
各参数含义如下:
参数名 | 含义 |
---|---|
path | 用于指定路径,默认为’.',.是相对路径表示法中当前目录的意思,即getwd()得到的路径 |
pattern | 是正则表达式,若pattern不为NULL,返回文件(目录)名满足该正则表达式的文件(目录) |
all.files | 默认为FLASE,若为FALSE则不显示隐藏文件(目录),若为TRUE则返回所有文件(目录) |
full.names | 默认为FLASE,若为FALSE则只返回文件(目录)名,若为TRUE则返回文件(目录)路径 |
recursive | 表示是否递归遍历,即是否遍历子目录下的文件和目录,默认为FLASE |
ignore.case | 若为TRUE则在匹配pattern时不区分大小写 |
include.dirs | 在recursive为TURE时,若include.dirs为FALSE则只列出最终端的文件名,而不列出中间层级的目录名 |
no… | 若为TRUE,则不显示“.”和“…” |
程序例子如下:
dir(recursive=TRUE) # 递归遍历当前目录
list.dirs() # 遍历当前目录下的所有目录
结果如下:
转载:https://blog.csdn.net/weixin_42364196/article/details/127873031