使用dplyr在R中如何执行多个左连接?

86

我该如何使用dplyr在R中合并多个数据框?

new <- left_join(x,y, by = "Flag")

这是我用来左连接x和y的代码。 但是该代码对于多个连接不起作用。

new <- left_join(x,y,z by = "Flag")

1
通常情况下,您可以使用left_join而不是merge来同时合并多个数据集。以下是在R中合并多个数据集的方法:这是如何在R中合并多个数据集的方法 - David Arenburg
3
使用Reduce(function(dtf1,dtf2) left_join(dtf1,dtf2,by="index"), list(x,y,z))。由于这个问题被标记为重复,我在Simultaneously merge multiple data.frames in a list问题中给出了详细的答案和示例。 - Paul Rougieux
1个回答

189

您可以使用嵌套的left_join

 library(dplyr)
 left_join(x, y, by='Flag') %>%
                left_join(., z, by='Flag') 

还有另一种选择,就是把所有的数据集放在一个list中,并使用来自base RmergeReduce

Reduce(function(...) merge(..., by='Flag', all.x=TRUE), list(x,y,z))

或者我们可以使用来自plyrjoin_all函数。在这里,我们将数据框放入一个list中,并使用参数type='left'进行左连接。

library(plyr)
join_all(list(x,y,z), by='Flag', type='left')

正如@JBGruber在评论中提到的那样,也可以通过purrr来完成。

library(purrr)
library(dplyr)
purrr::reduce(list(x,y,z), dplyr::left_join, by = 'Flag')

10
我猜你可以把left_join嵌入到Reduce中,但昨天好像已经有人问过几次了,是吗? - David Arenburg
6
使用 pipe 选项和 join_left 的 reduce 函数速度更快(1.8秒),在我的情况下快了大约10倍 - 当然,这要看你的数据情况等条件。使用 merge 的 reduce 函数非常慢(16秒),但如果你将 merge 替换为 left_join,则与 pipe 的速度相当(平均稍微慢一点,约为1.9秒,但不显著)。最慢的是 plyr 中的 join_all 函数(22秒)。 - R. Prost
1
在tidyverse中,.指的是%>%左侧创建的整个对象。因此,它是从x和y的左连接创建的数据框。 - akrun
1
嘿@akrun,这是谷歌上的第一个搜索结果,也是一个很好的答案。你能否更新它,包括purrr::reduce,因为我认为这是目前最好的选择purrr::reduce(list(x,y,z), dplyr::left_join, by = 'Flag') - JBGruber
1
喜欢 reduce() merge() 的组合。假设您从环境中收集了一系列频率数据框,并且想要通过“标志”列将它们组合起来:`df_list=mget((ls(pattern=".*_freq")))Reduce(function(...) merge(..., by='hallmarks', all.x=TRUE), df_list )` - bioSlayer
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接