首页 > > > 【R语言】tidyverse之一:读写数据
(1) tibble包
R 数据框的更先进的替代,不将字符串转化为因子型,不重命名列,输出内容更智能,选择 tibble 子集仍是 tibble(Base R 中,1列返回向量)
(2) readr包
读写纯文本文件,包括带分隔符的文本文件,如 csv和 tsv. 也能读写序列化的 R 对象 rds,若想保存数据集后续再加载回来,rds将保存元数据和该对象的状态,如分组和数据类型。
(3) readxl包
专门读取 Excel 文件,包括同一个工作簿中的不同工作表。
(4) writexl包
(5) haven包
读写 SPSS, Stata, SAS 数据文件。
(6) 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数据参考文献:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3147996/ ,如需转载,请注明出处,否则将追究法律责任。