r - 如何使用dplyr连接多个数据框?

标签 r dplyr reduce

我想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

最佳答案

我知道为时已晚。...今天我被介绍到未回答的问题部分。抱歉打扰。

使用left_join()

dfs <- list(
              df1 = data.frame(b = c("a", "b", "c"), a = 1:3),
              df2 = data.frame(d = c("a", "c", "d"), c = 4:6),
              df3 = data.frame(b = c("b", "c", "e"), d = 7:9)
         )

func <- function(...){
  df1 = list(...)[[1]]
  df2 = list(...)[[2]]
  col1 = colnames(df1)[1]
  col2 = colnames(df2)[1]
  xxx = left_join(..., by = setNames(col2,col1))
  return(xxx)
}
Reduce( func, dfs)
#  b a  c  d
#1 a 1  4 NA
#2 b 2 NA  7
#3 c 3  5  8


使用merge()

func <- function(...){
  df1 = list(...)[[1]]
  df2 = list(...)[[2]]
  col1 = colnames(df1)[1]
  col2 = colnames(df2)[1]
  xxx=merge(..., by.x = col1, by.y = col2, , all.x = T)
  return(xxx)
}

Reduce( func, dfs)
#  b a  c  d
#1 a 1  4 NA
#2 b 2 NA  7
#3 c 3  5  8

关于r - 如何使用dplyr连接多个数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34344214/

相关文章:

r - if else 语句使用 R 中多列中的日期和匹配值来过滤行

r - 使用 ddply R 对大数据框中的大量列进行求和和 ifelse 的更好更快的方法

对象数组的Java Stream Reduce

r - 如何在 nlme 包中建模嵌套随机效应

r - 如何将散点图中每个点的垂线下降到(特征)向量?

R markdown 定义格式化宏

hadoop - 根据条件停止 Hadoop 中的 Reduce 函数

r - 在 R 中使用 ggplot2 表达三个变量之间的关系

r - 通过比较 R 中一列中的值来选择行

javascript - 在 Array#reduce 中设置 initialValue 与不设置 initialValue