抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

除了输入数据,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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> read_csv("func, index, val
> sin(), i, 1
> cos(), j, 2
> tan(), k, 3")
#> Rows: 3 Columns: 3
#>
#> -- Column specification ---------------------------------------
#> Delimiter: ","
#> chr (2): func, index
#> dbl (1): val
#>
#> i Use `spec()` to retrieve the full column specification for this data.
#> i Specify the column types or set `show_col_types = FALSE` to quiet this message.
#> # A tibble: 3 x 3
#> func index val
#> <chr> <chr> <dbl>
#> 1 sin() i 1
#> 2 cos() j 2
#> 3 tan() k 3

行内 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 中

评论



This is a picture without description

This is a picture without description This is a picture without description This is a picture without description