我在一个目录中有大量数据文件(> 1000)。我想将它们全部合并到R中的单个数据框中。它们都具有相同数量和类型的列。 到目前为止我所拥有的是:
setwd("directory")
files <- list.files()
for (i in 1:length(files)) assign(files[i], read.csv(files[i]))
这会为1000多个文件中的每一个创建数据框。有没有办法合并它们,而不必输入所有1000多个文件名列表?
任何帮助将不胜感激!
答案 0 :(得分:12)
使用data.table
(因速度推荐)执行此操作的标准方法是:
library(data.table)
data <- rbindlist(lapply(list.files(), fread))
还有其他功能,例如
rbindlist(lapply(list.files(), fread), fill = TRUE)
将会考虑一些或许多文件具有不同列名的可能性 - 在缺少该列的文件中,任何非重叠都将填充NA
。
编辑:正如@nicola所提到的,除非你真的知道自己在做什么,否则一般要避免使用assign
。
有关此目的的进一步参考,请参阅this帖子。
答案 1 :(得分:3)
这样做的一个好方法是使用data.table
。这个库有两个好处,适用于您的情况:a)它具有快速读取.csv文件的方式,以及b)快速组合data.tables
(data.frame
的扩展名)合而为一。所以本着这种精神,让我提出以下备选方案:
# if you don't have data.table installed, run install.packages('data.table') first
library(data.table)
files <- list.files('directory', full.names = TRUE)
#create a list to manage the individual files, only used to merge them in the end
FILES_LIST=vector("list",length(files))
for (i in 1:length(files)) {
FILES_LIST[[i]]<-fread(files[i]) #this reads your .csv file
}
FILES_LIST = rbindlist(FILES_LIST) #this merges all of your files in a big data.table
您感兴趣的变量最后是FILES_LIST
。
我希望这会有所帮助。