首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用dplyr连接多个数据帧?

如何使用dplyr连接多个数据帧?
EN

Stack Overflow用户
提问于 2015-12-17 21:04:53
回答 3查看 22.5K关注 0票数 27

我想要left_join多个数据帧:

代码语言:javascript
运行
复制
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的其他参数。有这样的工作吗?

代码语言:javascript
运行
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-03 07:20:13

已经太晚了,我know....today我被介绍到未回答的问题部分。抱歉打扰了。

使用left_join()

代码语言:javascript
运行
复制
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()

代码语言:javascript
运行
复制
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
票数 10
EN

Stack Overflow用户

发布于 2015-12-17 21:24:17

这对你有用吗?

代码语言:javascript
运行
复制
jnd.tbl <- df1 %>%
    left_join(df2, by='b') %>%
    left_join(df3, by='d')
票数 8
EN

Stack Overflow用户

发布于 2022-02-11 14:15:41

另一个解决办法是:

代码语言:javascript
运行
复制
library(purrr)
library(dplyr)

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"))
)

purrr::reduce(dfs, dplyr::left_join, by = 'b')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34344214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档