批量读取文件一文搞定

提高效率,解放双手

对于新手小白来说,使用 R读取文件第一个要过的门槛 ,当初我也是在这门槛绊倒过数次,不过多多练习,总结经验肯定会越来越熟练的。

当你有一两个或者两三个文件需要读取时,想必会一个个读进来就完事了,最多复制几行代码,改一下文件名咯。但是如果有成百上千个呢?那不是 废手废眼睛?

昨天群里有小伙伴问怎么批量读取文件,然后把文件一个个命名保存到环境变量里。写了一个批量读取的代码发在了群里,今天总结一下批量读取的多种方式。

我在桌面建了 dada 文件夹,里面有 5 个测试 txt 文件:

批量读取文件一文搞定 - 图1

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

这里先实现批量读取再赋值保存到环境变量的操作。

我觉得如果每个文件内容不一样,这样是可以的,但是文件如果太多,都保存到环境变量容易发生 变量名重名 之类的错误:

  1. # 加载R包
  2. library(dplyr)
  3. # 设置工作路径
  4. setwd('C:\\Users\\admin\\Desktop\\data')
  5. # 查看文件
  6. dalst <- list.files(pattern = '*.txt')
  7. dalst
  8. [1] "e.txt" "f.txt" "g.txt" "h.txt" "i.txt"

使用基础 for 循环读取:

  1. # for 循环
  2. for(i in 1:length(dalst)){
  3. # 名称向量
  4. name = c("a", "b", "c", "d","e")
  5. # 读取并赋值
  6. assign(name[i],read.table(dalst[i],header = T))
  7. }

批量读取文件一文搞定 - 图2

可以看到读取进来并且命好名保存到环境变量里了。

使用 lapply 版:

  1. # lapply 版
  2. dalst <- list.files(pattern = '*.txt') %>% lapply(.,read.table,header =T)
  3. for (i in 1:length(dalst)) {
  4. # 名称向量
  5. name <- c("a", "b", "c", "d","e")
  6. # 赋值
  7. assign(name[i],dalst[[i]])
  8. }

2、批量读取保存到 list

为避免储存太多环境变量或者发生错误,建议保存到 list 里,需要用的时候直接取出来即可。

  1. dalst <- list.files(pattern = '*.txt') %>% lapply(.,read.table,header =T)
  2. dalst
  3. [[1]]
  4. a ay b by
  5. 1 -1.5 -1.3 1.4 1.8
  6. 2 -1.6 -1.6 1.6 1.5
  7. [[2]]
  8. a ay b by
  9. 1 -1.5 -1.3 1.4 1.8
  10. 2 -1.6 -1.6 1.6 1.5
  11. ...

lapply 读取返回的直接是一个 list 的类型,但是每个 list 的名字是 1、2、3、4 的格式,我们只需要把名字改成对应的即可:

  1. # 命名list
  2. names(dalst) <- c("a", "b", "c", "d","e")
  3. dalst
  4. $a
  5. a ay b by
  6. 1 -1.5 -1.3 1.4 1.8
  7. 2 -1.6 -1.6 1.6 1.5
  8. $b
  9. a ay b by
  10. 1 -1.5 -1.3 1.4 1.8
  11. 2 -1.6 -1.6 1.6 1.5
  12. ...

mapply 版:

  1. # mapply 版
  2. # 文件名
  3. dalst <- list.files(pattern = '*.txt')
  4. # 名称向量
  5. name <- c("a", "b", "c", "d","e")
  6. res <- mapply(function(n,d){n <- read.table(d,header = T)},name,dalst,SIMPLIFY = F)
  7. res
  8. $a
  9. a ay b by
  10. 1 -1.5 -1.3 1.4 1.8
  11. 2 -1.6 -1.6 1.6 1.5
  12. $b
  13. a ay b by
  14. 1 -1.5 -1.3 1.4 1.8
  15. 2 -1.6 -1.6 1.6 1.5
  16. ...

3、批量读取合并保存到数据框

如果每个数据的 列名一样 ,只是 记录的内容不一样 ,我们更希望批量读取进来并且 合并到一个表格里面 ,这也是批量读取最常用的方式,并且结果可读性更好:

do.call 合并数据:

  1. # do.call
  2. list.files(pattern = '*.txt') %>% lapply(.,read.table,header =T) %>%
  3. do.call(rbind,.)
  4. a ay b by
  5. 1 -1.5 -1.3 1.4 1.8
  6. 2 -1.6 -1.6 1.6 1.5
  7. 3 -1.5 -1.3 1.4 1.8
  8. ...

Reduce 合并数据:

  1. # Reduce
  2. list.files(pattern = '*.txt') %>% lapply(.,read.table,header =T) %>%
  3. Reduce(rbind,.)
  4. a ay b by
  5. 1 -1.5 -1.3 1.4 1.8
  6. 2 -1.6 -1.6 1.6 1.5
  7. 3 -1.5 -1.3 1.4 1.8
  8. ...

purrrmap_dfr 函数直接内部合并,不需要再合并,简化操作:

  1. # map 函数
  2. library(purrr)
  3. list.files(pattern = '*.txt') %>% map_dfr(.,read.table,header =T)
  4. a ay b by
  5. 1 -1.5 -1.3 1.4 1.8
  6. 2 -1.6 -1.6 1.6 1.5
  7. 3 -1.5 -1.3 1.4 1.8
  8. ...

plyr 包和 map_dfr 有异曲同工之妙,也是非常的方便:

  1. # plyr 包
  2. library(plyr)
  3. list.files(pattern = '*.txt') %>% ldply(.,read.table,header =T)
  4. a ay b by
  5. 1 -1.5 -1.3 1.4 1.8
  6. 2 -1.6 -1.6 1.6 1.5
  7. 3 -1.5 -1.3 1.4 1.8
  8. ...

现在批量读取再也不用麻麻担心你不会了。