我正在尝试将merge
多个data.frames
合并为一个data.frame
。由于我有一个完整的文件列表,我试图用循环结构来做它。
到目前为止,循环方法运行良好。然而,它看起来效率很低,我想知道是否有更快更容易的方法。
以下是该方案:
我有一个包含多个.csv
文件的目录。每个文件包含可用作合并变量的相同标识符。由于文件的大小相当大,我想把每个文件一次一个地读入R而不是一次读取所有文件。
所以我用list.files
获取目录的所有文件并读入前两个文件。之后我使用merge
获得一个data.frame
。
FileNames <- list.files(path=".../tempDataFolder/")
FirstFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[1], sep=""),
header=T, na.strings="NULL")
SecondFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[2], sep=""),
header=T, na.strings="NULL")
dataMerge <- merge(FirstFile, SecondFile, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"),
all=T)
现在,我使用for
循环将所有剩余的.csv
个文件及merge
个文件存入已存在的data.frame
:
for(i in 3:length(FileNames)){
ReadInMerge <- read.csv(file=paste(".../tempDataFolder/", FileNames[i], sep=""),
header=T, na.strings="NULL")
dataMerge <- merge(dataMerge, ReadInMerge, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"),
all=T)
}
即使它运作得很好,但我想知道是否有更优雅的方式来完成工作?
答案 0 :(得分:38)
您可能希望仔细查看related question on stackoverflow。
我会分两步处理:导入所有数据(使用plyr
),然后将它们合并在一起:
filenames <- list.files(path=".../tempDataFolder/", full.names=TRUE)
library(plyr)
import.list <- llply(filenames, read.csv)
这将为您提供现在需要合并在一起的所有文件的列表。有很多方法可以做到这一点,但这里有一种方法(使用Reduce
):
data <- Reduce(function(x, y) merge(x, y, all=T,
by=c("COUNTRYNAME", "COUNTRYCODE", "Year")), import.list, accumulate=F)
或者,如果您对reshape
不满意,可以使用Reduce
包执行此操作:
library(reshape)
data <- merge_recurse(import.list)
答案 1 :(得分:1)
如果我没弄错的话,一个非常简单的改变可以消除3:length(FileNames)
kludge:
FileNames <- list.files(path=".../tempDataFolder/", full.names=TRUE)
dataMerge <- data.frame()
for(f in FileNames){
ReadInMerge <- read.csv(file=f, header=T, na.strings="NULL")
dataMerge <- merge(dataMerge, ReadInMerge,
by=c("COUNTRYNAME", "COUNTRYCODE", "Year"), all=T)
}