4 回答
TA贡献1796条经验 获得超4个赞
另一个问题具体询问如何在R中使用dplyr执行多个左连接。这个问题被标记为这个问题的副本,所以我在这里回答,使用下面的3个示例数据框:
library(dplyr)
x <- data_frame(i = c("a","b","c"), j = 1:3)
y <- data_frame(i = c("b","c","d"), k = 4:6)
z <- data_frame(i = c("c","d","a"), l = 7:9)
更新2018年6月:我将答案分为三个部分,分别代表三种不同的合并方式。purrr如果您已经在使用tidyverse软件包,那么您可能希望使用这种方式。为了进行比较,您将找到使用相同样本数据集的基本R版本。
reduce从purrr包中加入他们
该purrr包提供了一个reduce具有简洁语法的函数:
library(tidyverse)
list(x, y, z) %>% reduce(left_join, by = "i")
# A tibble: 3 x 4
# i j k l
# <chr> <int> <int> <int>
# 1 a 1 NA 9
# 2 b 2 4 NA
# 3 c 3 5 7
您还可以执行其他连接,例如a full_join或inner_join:
list(x, y, z) %>% reduce(full_join, by = "i")
# A tibble: 4 x 4
# i j k l
# <chr> <int> <int> <int>
# 1 a 1 NA 9
# 2 b 2 4 NA
# 3 c 3 5 7
# 4 d NA 6 8
list(x, y, z) %>% reduce(inner_join, by = "i")
# A tibble: 1 x 4
# i j k l
# <chr> <int> <int> <int>
# 1 c 3 5 7
dplyr::left_join() 与基地R Reduce()
list(x,y,z) %>%
Reduce(function(dtf1,dtf2) left_join(dtf1,dtf2,by="i"), .)
# i j k l
# 1 a 1 NA 9
# 2 b 2 4 NA
# 3 c 3 5 7
基础R merge()与基础RReduce()
为了进行比较,这里是左连接的基本R版本
Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "i", all.x = TRUE),
list(x,y,z))
# i j k l
# 1 a 1 NA 9
# 2 b 2 4 NA
# 3 c 3 5 7
TA贡献1993条经验 获得超5个赞
您可以merge_all
在reshape
包中使用它。您可以传递参数以merge
使用...
参数
reshape::merge_all(list_of_dataframes, ...)
TA贡献1895条经验 获得超3个赞
您可以使用递归来执行此操作。我没有验证以下内容,但它应该给你正确的想法:
MergeListOfDf = function( data , ... ){ if ( length( data ) == 2 ) { return( merge( data[[ 1 ]] , data[[ 2 ]] , ... ) ) } return( merge( MergeListOfDf( data[ -1 ] , ... ) , data[[ 1 ]] , ... ) )}
- 4 回答
- 0 关注
- 1556 浏览
添加回答
举报