dplyr在函数中连接两个表,其中一个变量名是函数

时间:2016-07-21 12:11:55

标签: r dplyr

我试图在函数中使用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')

第一次和第二次尝试给出错误

  

错误:&#39; sexvar&#39;在rhs中找不到列,无法加入

而最后一次尝试发出错误

  

错误:&#39;性别&#39;在lhs中找不到列,无法加入,

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

有谁可以指出我哪里出错?

2 个答案:

答案 0 :(得分:2)

尝试:

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

我确信有一种更优雅的方式可以使用延迟评估等方式来实现这一点,但这会让你在此期间开始运行。

答案 1 :(得分:2)

块中的oneliner可能如下所示(与上次尝试类似)

DrawerLayout

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

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