我有许多要合并的data.frames的列表。这里的问题是,每个data.frame的行数和列数不同,但它们都共享关键变量(我在下面的代码中将其称为“var1”和“var2”)。如果data.frames在列方面是相同的,我只能rbind,plyr的rbind.fill就可以完成这项工作,但这些数据不是这样的
因为merge命令只对2个data.frames有效,所以我转向互联网寻求灵感。我从这里得到了这个,它在R 2.7.2中运行得非常好,这就是我当时所拥有的:
merge.rec<;-函数(.list,…){
如果(长度(.list)==1)返回(.list[[1]])
回忆(c(列表(合并(.list[[1]],.list[[2]],…),.list[-(1:2)],…)
}
我会这样调用函数:
df<;-merge.rec(my.list,by.x=c(“var1”、“var2”),
by.y=c(“var1”、“var2”),all=T,后缀=c(“,”)
但在2.7.2之后的任何R版本(包括2.11和2.12)中,此代码失败,并出现以下错误:
匹配中出现错误。名称(类别、名称(xi)):
名称与以前的名称不匹配
(顺便说一句,我在其他地方看到了对这一错误的其他引用,但没有得到解决)
有什么办法解决这个问题吗
另一个问题专门询问如何在R中使用dplyr执行多个左连接。该问题被标记为该问题的副本,因此我在这里使用以下3个样本数据框进行回答:
x<;-数据帧(i=c(“a”、“b”、“c”),j=1:3,stringsAsFactors=FALSE)
y<;-数据帧(i=c(“b”、“c”、“d”),k=4:6,stringsAsFactors=FALSE)
z<;-数据帧(i=c(“c”、“d”、“a”),l=7:9,stringsAsFactors=FALSE)
2018年6月更新:我将答案分为三个部分,代表三种不同的合并方式。如果您已经在使用tidyverse软件包,则可能需要使用purrr方式。为了在下面进行比较,您将使用相同的示例数据集找到基本R版本
1)使用purrr包中的reduce加入他们:
purrr软件包提供了一个reduce函数,该函数具有简洁的语法:
库(tidyverse)
列表(x、y、z)%>;%减少(左U形连接,按=";i";)
#一个tibble:3x4
#i j k l
#<;chr>&书信电报;int>&书信电报;int>&书信电报;int>;
#1 a 1 NA 9
#2b24na
#3C357
您还可以执行其他联接,例如完全联接或内部联接:
列表(x,y,z)%>;%减少(完全“U”连接,减少=“i”)
#一个tibble:4x4
#i j k l
#<;chr>&书信电报;int>&书信电报;int>&书信电报;int>;
#1 a 1 NA 9
#2b24na
#3C357
#4 d NA 6 8
列表(x、y、z)%>;%reduce(内部“u连接,by=”i“
#一个tibble:1 x 4
#i j k l
#<;chr>&书信电报;int>&书信电报;int>&书信电报;int>;
#1 c 3 5 7
2)dplyr::left_join()与基RReduce():
列表(x,y,z)%>;%
Reduce(函数(dtf1,dtf2)左联合(dtf1,dtf2,by=";i";,)
#i j k l
#1 a 1 NA 9
#2b24na
#3C357
3)基本Rmerge()与基本RReduce():
为了便于比较,这里是基于Charles答案的左连接的基本R版本
Reduce(函数(dtf1,dtf2)merge(dtf1,dtf2,by=";i";,all.x=TRUE),
列表(x、y、z))
#i j k l
#1 a 1 NA 9
#2b24na
#3C357