我有一个我要合并的许多data.frames的列表.这里的问题是每个data.frame在行数和列数方面都不同,但它们都共享关键变量(我已经调用过"var1","var2"在下面的代码中).如果data.frames在列方面是相同的,我只能rbind,plyr的rbind.fill可以完成这项工作,但这些数据并非如此.
因为该merge命令仅适用于2个data.frames,所以我转向Internet寻求创意.我从这里得到了这个,它在R 2.7.2中完美运行,这是我当时所拥有的:
merge.rec <- function(.list, ...){
if(length(.list)==1) return(.list[[1]])
Recall(c(list(merge(.list[[1]], .list[[2]], ...)), .list[-(1:2)]), ...)
}
Run Code Online (Sandbox Code Playgroud)
我会像这样调用函数:
df <- merge.rec(my.list, by.x = c("var1", "var2"),
by.y = c("var1", "var2"), all = T, suffixes=c("", ""))
Run Code Online (Sandbox Code Playgroud)
但是在2.7.2之后的任何R版本中,包括2.11和2.12,此代码失败并出现以下错误:
Error in match.names(clabs, names(xi)) :
names do not match previous names
Run Code Online (Sandbox Code Playgroud)
(很明显,我在其他地方看到了其他对此错误的引用而没有解决方案).
有什么方法可以解决这个问题吗?
作为一个更大问题的一部分(为多边形ID相同的情况添加一个,makeUniqueIDs参数rbind.SpatialPolygonsDataFrame),我遇到了来自rbind的这个奇怪的消息:
> do.call("rbind",xd.small)
Error in match.names(clabs, names(xi)) :
names do not match previous names
Run Code Online (Sandbox Code Playgroud)
我能找到的唯一其他信息是这个问题,这让我相信这rbind也是问题的根源.
我当然可以编写自己的类似rbind的函数,但可能这种match.names检查是有原因的,我很好奇它是什么.
我想把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)
Run Code Online (Sandbox Code Playgroud)
现在我使用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)
}
Run Code Online (Sandbox Code Playgroud)
即使它工作得很好我想知道是否有更优雅的方式来完成工作?
在2010年回答了类似的问题.它有12K的观点,但没有解决方案.这是帖子:
合并多个数据框 - match.names(clabs,names(xi))中的错误:名称与先前的名称不匹配
我从Facebook业务经理下载了格式相同的报告.但是当我尝试使用rbind(df1,df2)将它们组合时,我得到了
match.names(clabs,names(xi))出错:名称与以前的名称不匹配
通过诊断,我进行了比较
x <-names(df1)到y <-names(df2)
x和y是相同的,我还检查了object.size(x)和object.size(y),这些也是相同的.
gtools包中的smartbind函数似乎有效,但我想了解如何在基数R中解决这个问题.这是两个数据帧中每一个的两行:
> dput(df1)
structure(list(Campaign.Name = c("Bad Kitty Drawn to Trouble",
"Bad Kitty Drawn to Trouble"), Results = c(0L, 0L), performance_indicator = c("",
""), Reach = c(17465L, 29848L), Cost.per.Result..USD. = c(0,
0), Amount.Spent..USD. = c(10.48, 35.83), Ends = c("2014-02-03",
"2014-02-03"), adgroup_id = c(NA, NA), Button.Clicks = c(0L,
0L), Campaign.ID = c(6014996473560, 6014996473560), campaign_id = c(NA,
NA), campaign_name = c(NA, NA), Clicks = c(41L, 229L), Cost.Per.All.Actions..USD. = c(0.80615384615385,
0.3852688172043), Cost.Per.Unique.Click..USD. = …Run Code Online (Sandbox Code Playgroud)