
一. 相关包简介
(1) tibble包
R 数据框的更先进的替代,不将字符串转化为因子型,不重命名列,输出内容更智能,选择 tibble 子集仍是 tibble(Base R 中,1列返回向量)
- 查看数据框:glimpse()
- 创建数据框:tibble()和 tribble() (智能行tibble)
- 强制转化为数据框:as_tibble()和enframe()
- 操作行名:rownames_to_column()和column_to_rownames()
(2) readr包
读写纯文本文件,包括带分隔符的文本文件,如 csv和 tsv. 也能读写序列化的 R 对象 rds,若想保存数据集后续再加载回来,rds将保存元数据和该对象的状态,如分组和数据类型。
- 读入数据到数据框:read_csv()和read_tsv()
- 读入欧式格式数据(“;”为字段分隔符,“,”为小数位):read_csv2() 和 read_tsv2()
- 读写rds:read_rds()和write_rds()
- 写入电子表格:write_csv(), write_tsv(), write_csv2(), write_tsv2()
- 转化数据类型:parse_number(), parse_logical(), parse_factor()等
(3) readxl包
专门读取 Excel 文件,包括同一个工作簿中的不同工作表。
- read_excel(): 自动检测文件扩展名
- read_xls()
- read_xlsx()
(4) writexl包
- write_xlsx():写入Excel文件
(5) haven包
读写 SPSS, Stata, SAS 数据文件。
- 读:read_spss(), read_stata(), read_sas()
- 写:write_spss(), write_stata(), write_sas()
(6) readtext包
读取全部文本文件的内容到数据框,每个文件变成一行,通常用于语言分析或数据收集。
- readtext()
二. 导入数据
下面以导入 csv 文件为例,演示从一个文件或多个文件读入数据,其它类型文件换成对应读入函数即可。
1. 导入一个csv文件
trap_ins <- read_csv("data/light_trap/1992.csv")
glimpse(trap_ins)

注意,readr 包试着猜测每列的数据类型(数值型、字符型等),但属于保守猜测,以避免丢失信息。本例中,date 列为字符型,因为它没有认出日期格式,individuals 列为 Double 型。通常更建议随后再用 dplyr 包修改数据类型。
2. 导入多个csv文件
若每个 csv 文件的列结构相同,则可以全部导入再按行合并。
最好的做法是用 purrr 包迭代实现。
先列出要导入的csv文件的路径:
list_of_files <- list.files("data/light_trap/", pattern="csv", full.names=TRUE)
list_of_files

接着,在其上做迭代,应用 read_csv() 到每个文件路径,再按行合并。
可以用 Base R 自带的 apply 函数族,但更建议用 purrr 包,其用户接口更容易记,并返回可预见的数据类型,还可用于管道操作。
这里用 map_dfr() 函数:
map_dfr(.x, .f, .id = "id_col")
它应用函数 .f 到列表或向量 .x 的每个元,再将每个结果做“行合并”创建数据框,并增加新列 id_col 描述该行来自哪个文件。
library(purrr)
light_trap <- map_dfr(.x=set_names(list_of_files), .f=read_csv, .id="source_file") # names用于.id
glimpse(light_trap)

经常遇到的一个问题是,数据表的列具有不同的数据类型。例如,某表 presence/absence 编码为 1/0, 而另一个表编码为 TRUE/FALSE. 则这样的列不能做“行合并”,因为 R 不知道如何转化类型。
此时,你可以告诉 read_csv() 以字符形式导入所有列,后续再处理类型转化。
light_trap <- map_dfr(.x = set_names(list_of_files), .f = ~ read_csv(.x, col_types=cols(.default="c")), .id = "source_file")
glimpse(light_trap)

说明:“~”是 purrr 包对匿名函数的缩写,等同于
.f = function(.x) {read_csv(.x, col_types = ...)}
三. 导出数据
用 readr 包中的 write_csv() 和 write_rds() 可以保存数据框到文件。下面以导出数据到 .rds 文件为例,因为它能保存数据框及其元数据,如数据类型和分组(若有的话)。
iris %>% write_rds("my_iris.rds")
my_import <- read_rds("my_iris.rds") # 导入.rds数据
参考文献:
- Desi Quintans, Jeff Powell. Working in the Tidyverse. http://www.hiercourse.com/
- Garrett Grolemund, Hadley Wickham. R for Data Science. https://r4ds.had.co.nz/