我正在尝试将多个data.frames
合并为一个data.frames
。因为我有一个完整的文件列表,所以我尝试使用循环结构
到目前为止,循环方法运行良好。然而,它看起来效率很低,我想知道是否有一种更快更简单的方法
以下是场景:
我有一个包含多个.csv
文件的目录。每个文件都包含可以用作合并变量的相同标识符。由于文件的大小相当大,我想一次读取一个文件到R中,而不是一次读取所有文件。
因此,我使用list.files
获取目录中的所有文件,并读取前两个文件。然后我使用merge
获得一个data.frame
文件名<;-list.files(path=“…/tempDataFolder/”)
第一文件<;-read.csv(file=paste(“…/tempDataFolder/”,文件名[1],sep=”“),
header=T,na.strings=“NULL”)
第二文件<;-read.csv(file=paste(“…/tempDataFolder/”,文件名[2],sep=”“),
header=T,na.strings=“NULL”)
数据合并<;-合并(第一个文件,第二个文件,按=c(“国家名称”、“国家代码”、“年份”),
全部=T)
现在,我使用for
循环获取所有剩余的.csv
文件,并将它们合并到现有的
数据中。frame
:
用于(i in 3:长度(文件名)){
ReadInMerge<;-read.csv(文件=粘贴(“…/tempDataFolder/”,文件名[i],sep=”“),
header=T,na.strings=“NULL”)
dataMerge<;-merge(dataMerge,ReadInMerge,by=c(“COUNTRYNAME”、“COUNTRYCODE”、“Year”),
全部=T)
}
尽管效果很好,但我想知道是否有更优雅的方式来完成这项工作
您可能想看看与stackoverflow密切相关的问题
我将通过两个步骤实现这一点:导入所有数据(使用plyr
),然后将其合并在一起:
文件名<;-list.files(path=“…/tempDataFolder/”,full.names=TRUE)
图书馆(plyr)
import.list<;-llply(文件名,read.csv)
这将为您提供一个现在需要合并在一起的所有文件的列表。有很多方法可以做到这一点,但这里有一种方法(使用Reduce
):
数据<;-减少(函数(x,y)合并(x,y,all=T,
by=c(“国家名称”、“国家代码”、“年份”)、import.list、accumulate=F)
或者,如果您对Reduce
不满意,可以使用重塑
软件包执行此操作:
库(重塑)
数据<;-merge_recurse(import.list)