【发布时间】:2016-03-24 11:44:59
【问题描述】:
我要left_join多个数据框:
dfs <- list(
df1 = data.frame(a = 1:3, b = c("a", "b", "c")),
df2 = data.frame(c = 4:6, b = c("a", "c", "d")),
df3 = data.frame(d = 7:9, b = c("b", "c", "e"))
)
Reduce(left_join, dfs)
# a b c d
# 1 1 a 4 NA
# 2 2 b NA 7
# 3 3 c 5 8
之所以有效,是因为它们都有相同的b 列,但Reduce 不允许我指定可以传递给left_join 的其他参数。有这样的解决方法吗?
dfs <- list(
df1 = data.frame(a = 1:3, b = c("a", "b", "c")),
df2 = data.frame(c = 4:6, d = c("a", "c", "d")),
df3 = data.frame(d = 7:9, b = c("b", "c", "e"))
)
更新
这种工作:Reduce(function(...) left_join(..., by = c("b" = "d")), dfs) 但是当by 是多个元素时,它会给出这个错误:Error: cannot join on columns 'b' x 'd': index out of bounds
【问题讨论】:
-
你不能
Reduce(function(...) left_join(..., other args here), dfs)吗? -
我没想到。我可以!随意写它作为你的答案
-
嗯,实际上,如果
by有多个元素,这会中断。查看更新 -
您希望函数如何知道要加入哪些列?这并不是 *_join 函数设计的真正目的。如果所有列都有一个可以使用的公共 ID 列,那么您的更新可以解决问题。否则,您将不得不手动指定用于每对连接的列。
-
试试 purrr:reduce() 代替吗?