除了输入数据,R 还支持读取文件中的数据。readr
包可以完成这个任务,它也是 tidyverse
包的核心包之一。
介绍
readr
包的多数函数用于将平面文件(可以简单地理解为通用数据文件)转换为 tibble :
read_csv()
:读取逗号文件read_csv2()
:读取分号文件read_tsv()
:读取制表符分隔文件read_delim()
:读取任意分隔符的文件read_fwf()
:读取固定宽度的文件
该函数有两个辅助函数 fwf_width() 和 fwf_positions() 来分别按照宽度和位置来设定域,还有一个变种函数 read_table() ,其使用空白字符来分隔各列
read_log()
:读取 Apache 风格的日志文件(需webreadr
包支持)
这些函数的语法基本相同。
语法
read_csv()
函数的第一参数为读取文件的路径(以字符串形式给出)。
此外,read_csv()
函数还允许接受一个行内 CSV 文件,如:
1 | > read_csv("func, index, val |
行内 CSV 文件的数据分行除了显示换行,还可以使用换行转义字符 \n
解析向量
由于大部分文件的内容是以文本形式给出的,因此处理字符(串)是相当常见的操作。readr
包中含有 parse_*()
辅助函数族,其接受一个字符向量,并返回该向量的其它类型向量:
parse_logical()
:返回给定字符向量的逻辑向量parse_integer()
:返回给定字符向量的整数向量parse_double()
和parse_number()
:分别返回给定字符向量的数值型向量和数字型向量,两者大致相同但前者对数据的要求更为严格parse_character()
:返回给定字符向量的字符向量,常用于解决字符编码问题parse_factor()
:返回给定字符向量的因子向量parse_datetime()
、parse_date()
和parse_time()
:分别返回给定字符向量的日期时间向量、日期向量和时间向量
这些函数带有 na
参数,该参数接收一个字符串,并将第一参数(字符向量)中与该参数的值相同的参数转换为 NA。
如果对不符合条件的向量进行转换,那么向量中不能进行转换的元素会被转换为 NA ,并给出警告信息
对于具有警告信息的解析后向量 x ,可以使用 problems(x) 来获取完整的解析失败信息集合。使用 attr(x, problems) 可以达到相同效果。但由于 x 是原子型向量,所以 x$problems 并不能起效
解析数值
由于地区的原因,数字在某些情况下可能会发生小数点歧义、单位歧义和分组歧义等。因此为了更好地解析数值,parse_double()
和 parse_number()
有参数 locale
和辅助参数 locale()
来实现消歧义功能。
常见的形式为:locale = locale(decimal_mark = ".", grouping_mark = ",")
。这里面两个参数的值可以更换为其他符号,该例表示解析数值时将 .
识别为小数点,将 ,
识别为分组符。即数字 123,456.78
会识别为 123456.78
。
解析字符串
由于计算机系统的原因,同样的文本信息在一台计算机上显示正常,在另一台计算机上可能会乱码。由于 readr
默认数据是 UTF-8 编码的,所以当数据来源不是该编码方式时,需要指定编码方式:parse_character(x, locale = locale(encoding = "<coding_sys>"))
。这个例子会将 x 按 <coding_sys>
编码系统进行读取。
在不知道原数据的编码方式时,可以使用 guess_encoding(charToRaw(x))
推测数据集 x 的编码方式。
因子
R 使用因子表示取值范围是已知集合的分类变量(类似于 C++ 中的枚举类型)。 parse_factor(x, levels = NULL)
会将字符向量 x 解析为因子。默认情况下会以 x 中的唯一值转换为因子,若将一个字符向量赋值给参数 levels
时,该函数会将 x 中符合该参数中的元素的值进行转换,并在 x 中存在不符合元素的状况下给出警告信息。
日期时间、日期与时间
该部分的内容较为复杂,值得注意的一点是数据 x 为默认符合 ISO 8601 标准的日期时间。
解析文件
可以使用 guess_parser(x)
来让 readr
猜测字符向量 x 应被解析为何种数据类型。
写入文件
可以使用 write_csv()
和 write_tsv()
将数据写入逗号分隔值文件和制表符分隔值文件。这两个函数中的第一参数和第二参数必须明确给定,分别是对象名和文件路径名(以字符方式)。
当数据被保存至 CSV 文件时,类型信息并不会一起保存
由于使用以上方式存储数据会导致列类型信息丢失,因此可以使用以下两种方式来避免这一结果:
write_rds(x, file)
和read_rds(file)
可以将数据 x 保存为 RDS 格式和读取 RDS 格式文件
RDS 格式文件为 R 自定义的二进制格式
write_feather(x ,file)
和read_feather(x)
可以实现一种快速二进制格式,该格式可以在多个编程语言间共享
该函数包含于包 feather 中