Chức năng eat
củ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ừ .x
tất cả .x
cá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
NA
cá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_join
như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
by
tranh cãi.