我试图在函数中使用dplyr连接两个表,其中一个变量名由函数的参数定义。在其他dplyr函数中,通常有一个版本可用于非标准评估,例如select
& select_
,rename
和rename_
等,但不适用于_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
,但不知何故不将其视为列标题。
有谁可以指出我哪里出错?
答案 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))