R语言七天入门教程六:文件相关操作

R语言七天入门教程六:文件相关操作
一、文件的读写

R 语言作为统计学编程语言,常常需要处理大量数据,而这些数据通常会从文件中进行读取,因此文件读写在R语言中是非常重要的操作。在R语言中,用到最多的文件格式是csv文件。

1、文本文件
  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)

运行结果如下:

image-20221115155113636

注意:file.txt应该放在当前的工作目录(working directory)下,在R语言中可以通过getwd()函数来查看当前的工作目录,setwd()函数来设置当前的工作目录。这里传入的文件路径’file.txt’是相对路径,只会在当前工作目录下查找。关于相对路径和绝对路径,简单理解就是:相对路径是文件相对于当前目录的路径,绝对路径是文件在操作系统中完整的文件路径。更多内容,可以参考相对路径和绝对路径

在R Studio中,我们可以通过如下方式来快速在当前目录新建文本文件,填写相关内容后,保存为file.txt即可:

image-20221115154513670

  1. 与之对应的,写入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)

结果如下:

image-20221115160643656

可以看到writeLines()函数是覆盖写入,新的内容会覆盖旧的内容。

2、csv文件
  1. 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)

结果如下:

image-20221115164245576

注意:文件的最后一行需要保留一个空行,不然会有警告。警告可以忽略,程序仍可以正常运行,但是为了美观,最好保留一个空行。file.txt中最后有空行,所以无警告信息。

  1. 由于读取到的是一个数据框类型,所以可以对读取到的数据进行修改,查询等操作。也可以将更新后的数据框保存到新的文件中,对应函数是 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)

结果为:

image-20221115170816866

此时,用记事本打开file.csv文件发现,字符串数据都被""括起来了。

image-20221115170940063

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:

image-20221115173734776

读取代码如下:

library("xlsx") # 先导入库
data = read.xlsx("file.xlsx", sheetIndex = 1) # 读取一个xlsx文件,sheetIndex是工作簿序号
print(data)

运行结果如下:

image-20221115173844499

二、文件和目录操作

在编码时,常常需要对文件和目录进行操作,例如,复制、移动、重命名等。常用的函数如下:

1、工作目录

工作目录(working directory)通常是当前项目所在位置,可以使用getwd()函数查看工作目录,使用setwd()设置目录。

程序例子如下:

getwd()
setwd('C:/Users/alex/Documents') # 设置工作目录为:C:/Users/alex/Documents
getwd() # 查看更改后的工作目录

结果如下:

image-20221115183725398

2、判断是否存在

dir.exists()file.exists()函数分别用于判断目录和文件是否存在。传入的参数可以是单一路径,也可以是一个向量,用于批量判断文件是否存在。

例如,当前工作目录为C:/Users/alex/Desktop/R demos,目录中文件如下:

image-20221115184411591

程序例子如下:

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'))

结果如下:

image-20221115184329856

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文件
# 上述采用的是相对路径,都只会在当前工作目录下创建

结果如下:

image-20221115191025959

此时,查看工作目录,会发现多了两个目录和新文件:

image-20221115191109285

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

结果如下:

image-20221115191628490

此时,查看工作目录,会发现文件和目录名称发生了变化:

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

结果如下:

image-20221115192705301

此时查看工作目录,可以发现相应文件和目录已经被删除:

image-20221115192827731

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

结果如下:

image-20221115193805282

此时查看工作目录,如下:

image-20221115193847474

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() # 遍历当前目录下的所有目录

结果如下:

image-20221115201332642

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值