Chức năng eatcủa gói safjoin của tôi có tính năng như vậy, nếu bạn cung cấp cho nó một danh sách data.frames làm đầu vào thứ hai, nó sẽ nối chúng theo cách đệ quy với đầu vào đầu tiên.
Mượn và mở rộng dữ liệu của câu trả lời được chấp nhận:
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)
z2 <- data_frame(i = c("a","b","c"), l = rep(100L,3),l2 = rep(100L,3)) # for later
# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)
eat(x, list(y,z), .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
Chúng tôi không phải lấy tất cả các cột, chúng tôi có thể sử dụng các trợ giúp chọn lọc từ tidyselect và chọn (vì chúng tôi bắt đầu từ .xtất cả .xcác cột được giữ):
eat(x, list(y,z), starts_with("l") ,.by = "i")
# # A tibble: 3 x 3
# i j l
# <chr> <int> <int>
# 1 a 1 9
# 2 b 2 NA
# 3 c 3 7
hoặc loại bỏ những cái cụ thể:
eat(x, list(y,z), -starts_with("l") ,.by = "i")
# # A tibble: 3 x 3
# i j k
# <chr> <int> <int>
# 1 a 1 NA
# 2 b 2 4
# 3 c 3 5
Nếu danh sách được đặt tên, tên sẽ được sử dụng làm tiền tố:
eat(x, dplyr::lst(y,z), .by = "i")
# # A tibble: 3 x 4
# i j y_k z_l
# <chr> <int> <int> <int>
# 1 a 1 NA 9
# 2 b 2 4 NA
# 3 c 3 5 7
Nếu có xung đột cột, .conflictđối số cho phép bạn giải quyết nó, ví dụ bằng cách lấy cái đầu tiên / thứ hai, thêm chúng, kết hợp chúng hoặc lồng chúng.
giữ đầu tiên:
eat(x, list(y, z, z2), .by = "i", .conflict = ~.x)
# # 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
giữ cuối cùng:
eat(x, list(y, z, z2), .by = "i", .conflict = ~.y)
# # A tibble: 3 x 4
# i j k l
# <chr> <int> <int> <dbl>
# 1 a 1 NA 100
# 2 b 2 4 100
# 3 c 3 5 100
thêm vào:
eat(x, list(y, z, z2), .by = "i", .conflict = `+`)
# # A tibble: 3 x 4
# i j k l
# <chr> <int> <int> <dbl>
# 1 a 1 NA 109
# 2 b 2 4 NA
# 3 c 3 5 107
hợp nhất:
eat(x, list(y, z, z2), .by = "i", .conflict = dplyr::coalesce)
# # A tibble: 3 x 4
# i j k l
# <chr> <int> <int> <dbl>
# 1 a 1 NA 9
# 2 b 2 4 100
# 3 c 3 5 7
tổ:
eat(x, list(y, z, z2), .by = "i", .conflict = ~tibble(first=.x, second=.y))
# # A tibble: 3 x 4
# i j k l$first $second
# <chr> <int> <int> <int> <int>
# 1 a 1 NA 9 100
# 2 b 2 4 NA 100
# 3 c 3 5 7 100
NAcác giá trị có thể được thay thế bằng cách sử dụng .fillđối số.
eat(x, list(y, z), .by = "i", .fill = 0)
# # A tibble: 3 x 4
# i j k l
# <chr> <int> <dbl> <dbl>
# 1 a 1 0 9
# 2 b 2 4 0
# 3 c 3 5 7
Theo mặc định nó một tăng cường left_joinnhưng tất cả dplyr tham gia được hỗ trợ thông qua các .modeđối số, mờ tham gia cũng được hỗ trợ thông qua các match_fun
tham số (nó quấn quanh gói fuzzyjoin) hoặc đưa ra một công thức như ~ X("var1") > Y("var2") & X("var3") < Y("var4")đến
bytranh cãi.