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條經驗 獲得超6個贊
您可以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 關注
- 1609 瀏覽
添加回答
舉報