批量读取文件一文搞定
感谢老俊俊的大力支持。我们会每日跟新,欢迎您关注老俊俊的生信笔记。

点击上方关注我们



提高效率,解放双手
对于新手小白来说,使用 R 来 读取文件 是 第一个要过的门槛 ,当初我也是在这门槛绊倒过数次,不过多多练习,总结经验肯定会越来越熟练的。
当你有一两个或者两三个文件需要读取时,想必会一个个读进来就完事了,最多复制几行代码,改一下文件名咯。但是如果有成百上千个呢?那不是 废手废眼睛?
昨天群里有小伙伴问怎么批量读取文件
,然后把文件一个个命名保存到环境变量里
。写了一个批量读取的代码发在了群里,今天总结一下批量读取的多种方式。
我在桌面建了 dada 文件夹,里面有 5 个测试 txt 文件:

1、批量读取保存到环境变量

这里先实现批量读取再赋值保存到环境变量的操作。
我觉得如果每个文件内容不一样,这样是可以的,但是文件如果太多,都保存到环境变量容易发生 变量名重名
之类的错误:
# 加载R包
library(dplyr)
# 设置工作路径
setwd('C:UsersadminDesktopdata')
# 查看文件
dalst <- list.files(pattern = '*.txt')
dalst
[1] "e.txt" "f.txt" "g.txt" "h.txt" "i.txt"
使用基础 for 循环读取:
# for 循环
for(i in 1:length(dalst)){
# 名称向量
name = c("a", "b", "c", "d","e")
# 读取并赋值
assign(name[i],read.table(dalst[i],header = T))
}

可以看到读取进来并且命好名保存到环境变量里了。
使用 lapply 版:
# lapply 版
dalst <- list.files(pattern = '*.txt') %>% lapply(.,read.table,header =T)
for (i in 1:length(dalst)) {
# 名称向量
name <- c("a", "b", "c", "d","e")
# 赋值
assign(name[i],dalst[[i]])
}
2、批量读取保存到 list

为避免储存太多环境变量或者发生错误,建议保存到 list 里,需要用的时候直接取出来即可。
dalst <- list.files(pattern = '*.txt') %>% lapply(.,read.table,header =T)
dalst
[[1]]
a ay b by
1 -1.5 -1.3 1.4 1.8
2 -1.6 -1.6 1.6 1.5
[[2]]
a ay b by
1 -1.5 -1.3 1.4 1.8
2 -1.6 -1.6 1.6 1.5
...
用 lapply
读取返回的直接是一个 list 的类型,但是每个 list 的名字是 1、2、3、4
的格式,我们只需要把名字改成对应的即可:
# 命名list
names(dalst) <- c("a", "b", "c", "d","e")
dalst
$a
a ay b by
1 -1.5 -1.3 1.4 1.8
2 -1.6 -1.6 1.6 1.5
$b
a ay b by
1 -1.5 -1.3 1.4 1.8
2 -1.6 -1.6 1.6 1.5
...
mapply 版:
# mapply 版
# 文件名
dalst <- list.files(pattern = '*.txt')
# 名称向量
name <- c("a", "b", "c", "d","e")
res <- mapply(function(n,d){n <- read.table(d,header = T)},name,dalst,SIMPLIFY = F)
res
$a
a ay b by
1 -1.5 -1.3 1.4 1.8
2 -1.6 -1.6 1.6 1.5
$b
a ay b by
1 -1.5 -1.3 1.4 1.8
2 -1.6 -1.6 1.6 1.5
...
3、批量读取合并保存到数据框

如果每个数据的 列名一样
,只是 记录的内容不一样
,我们更希望批量读取进来并且 合并到一个表格里面
,这也是批量读取最常用的方式,并且结果可读性更好:
do.call 合并数据:
# do.call
list.files(pattern = '*.txt') %>% lapply(.,read.table,header =T) %>%
do.call(rbind,.)
a ay b by
1 -1.5 -1.3 1.4 1.8
2 -1.6 -1.6 1.6 1.5
3 -1.5 -1.3 1.4 1.8
...
Reduce 合并数据:
# Reduce
list.files(pattern = '*.txt') %>% lapply(.,read.table,header =T) %>%
Reduce(rbind,.)
a ay b by
1 -1.5 -1.3 1.4 1.8
2 -1.6 -1.6 1.6 1.5
3 -1.5 -1.3 1.4 1.8
...
purrr 包 map_dfr 函数直接内部合并,不需要再合并,简化操作:
# map 函数
library(purrr)
list.files(pattern = '*.txt') %>% map_dfr(.,read.table,header =T)
a ay b by
1 -1.5 -1.3 1.4 1.8
2 -1.6 -1.6 1.6 1.5
3 -1.5 -1.3 1.4 1.8
...
plyr 包和 map_dfr 有异曲同工之妙,也是非常的方便:
# plyr 包
library(plyr)
list.files(pattern = '*.txt') %>% ldply(.,read.table,header =T)
a ay b by
1 -1.5 -1.3 1.4 1.8
2 -1.6 -1.6 1.6 1.5
3 -1.5 -1.3 1.4 1.8
...
现在批量读取再也不用麻麻担心你不会了。
代码 我上传到 QQ 群 老俊俊生信交流群
文件夹里。欢迎加入。加我微信我也拉你进 微信群聊 老俊俊生信交流群
哦。
群二维码:

老俊俊微信:
所以今天你学习了吗?
欢迎小伙伴留言评论!
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,赏杯快乐水喝喝吧!
推 荐 阅 读
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!