在列表中同时合并多个data.frames

我有许多要合并的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&gt&书信电报;int&gt&书信电报;int&gt&书信电报;int>
#1 a 1 NA 9
#2b24na
#3C357

您还可以执行其他联接,例如完全联接内部联接

列表(x,y,z)%>%减少(完全“U”连接,减少=“i”)
#一个tibble:4x4
#i j k l
#<chr&gt&书信电报;int&gt&书信电报;int&gt&书信电报;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&gt&书信电报;int&gt&书信电报;int&gt&书信电报;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

发表评论