【问题标题】:dplyr join two tables within a function where one variable name is an argument to the functiondplyr 在一个函数中连接两个表,其中一个变量名是函数的参数
【发布时间】:2016-11-25 00:43:24
【问题描述】:

我试图在一个函数中使用 dplyr 连接两个表,其中一个变量名由函数的参数定义。在其他 dplyr 函数中,通常有一个可用于非标准评估的版本,例如select & select_renamerename_ 等,但不适用于 _join 家族。我找到了this answer,但我无法让它在下面的代码中工作:

df1 <- data.frame(gender = rep(c('M', 'F'), 5), var1 = letters[1:10])

new_join <- function(df, sexvar){

  df2 <- data.frame(sex = rep(c('M', 'F'), 10), var2 = letters[20:1])

  # initial attempt using usual dplyr behaviour:
  # left_join(df, df2, by = c(sexvar = 'sex'))

  # attempt using NSE:
  # left_join(df, df2, 
  #           by = c(eval(substitute(var), list(var = as.name(sexvar)))) = 'sex'))

  # attempt using setNames:
  # left_join(df, df2, by = setNames(sexvar, 'sex'))

}

new_join(df1, 'gender')

第一次和第二次尝试都报错

错误:在 rhs 中找不到“sexvar”列,无法加入

虽然最后一次尝试给出了错误

错误:在 lhs 中找不到“性别”列,无法加入,

这至少表明它知道我想要列 gender,但不知何故不将其视为列标题。

谁能指出我哪里出错了?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    试试:

    df1 <- data.frame(gender = rep(c('M', 'F'), 5), var1 = letters[1:10])
    
    new_join <- function(df, sexvar){
    
      df2 <- data.frame(sex = rep(c('M', 'F'), 10), var2 = letters[20:1])
    
      join_vars <- c('sex')
      names(join_vars) <- sexvar
    
      left_join(df, df2, by = join_vars)
    }
    
    new_join(df1, 'gender')
    

    我确信有一种更优雅的方法可以使用惰性求值等方法让它工作,但这应该让你同时启动和运行。

    【讨论】:

    • 是的,确实如此,非常感谢。我会等着看是否有人用这种“更优雅的方式”回答,否则我会接受你的回答。再次感谢
    【解决方案2】:

    你的block中的oneliner可能看起来像这样(这与你上次的尝试类似)

    left_join(df, df2, by = structure("sex", names = sexvar))
    

    也可以将其扩展到两个变量

    left_join(df, df2, by = structure(sexvarDF1, names = sexvarDF2))
    

    【讨论】:

    • 谢谢你 - 我不知道那个功能。根据 Alex 的回答,我已经将这两个变量合并为一行:left_join(df, df2, by = setNames(c('sex', 'age'), c(sexvar, agevar))),这似乎完成了类似的任务
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2014-08-17
    • 1970-01-01
    相关资源
    最近更新 更多