【问题标题】:full_join by variable as column namesfull_join 按变量作为列名
【发布时间】:2018-03-05 13:00:10
【问题描述】:

我正在尝试使用dplyr的full_join来组合两个data.frame,例如:

col1 = 'b'
col2 = 'd'

df1 = data.frame(a = 1:3, b = 1:3)
df2 = data.frame(a = 1:3, d = 1:3)


full_join(df1, df2, c('a' = 'a', col1 = col2))

但它会返回

错误:by 不能包含 LHS 中缺少的连接列 col1

我正在寻找类似于

的输出
merge(df1, df2, by.x = c('a', col1), by.y = c('a', col2))
  a b
1 1 1
2 2 2
3 3 3

【问题讨论】:

标签: r dplyr


【解决方案1】:

你可以使用rename_,即,

library(dplyr)

full_join(df1, rename_(df2, .dots = setNames(col2, col1)))

给出,

#Joining, by = c("a", "b")
  a b
1 1 1
2 2 2
3 3 3

根据@akrun 和@mt1022 cmets 发布替代方案,

#akrun
full_join(df1, rename_at(df2, .vars = col2, funs(paste0(col1))))
full_join(df1, rename(df2, !!(col1) := !!rlang::sym(col2)))

#mt1022
full_join(df1, rename_at(df2, col2, ~col1))

【讨论】:

  • 另一个选项是rename_at(df2, .vars = col2, funs(paste0(col1)))rename(df2, !!(col1) := !!rlang::sym(col2))
  • @akrun,第一种选择的冗长方式:full_join(df1, rename_at(df2, col2, ~col1))
  • @mt1022 太好了
【解决方案2】:

像这样改变连接:

full_join(df1, df2, by=c('b'='d'))  
a.x b a.y
1   1 1   1
2   2 2   2
3   3 3   3

【讨论】:

    【解决方案3】:

    @MrFlick 在duplicate link 中的所有功劳,对OP 的示例稍作修改:

    full_join(df1, df2, by = c("a",setNames(col2, col1)))
    

    【讨论】:

      【解决方案4】:

      这将重现您的结果,但这是您要寻找的吗?

      full_join(df1, df2, by="a")%>%select(-d)
      

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多