使用quosure作为by参数连接数据集

Joe*_*Joe 5 r dplyr

我正在尝试编写一个自定义函数,该函数将使用quosures作为参数连接到left_join()函数“ by = c()”部分中的参数,从而将两个数据集连接起来。

这是我目前对该函数的尝试,在“ by = c(!! left_index = !! right_index))”部分失败。left_join期望将这些参数加引号,并且用引用加引号会使!!无效。

join_by_quosure <- function(data, left_index, var_to_impute, right_index){
  require(dplyr)

  left_index <- enquo(left_index)
  right_index <- enquo(right_index)
  var_to_impute <- enquo(var_to_impute)

  left_join(data, 
    data %>% select(!!right_index, !!var_to_impute),
    by = c(!!left_index = !!right_index))
}
Run Code Online (Sandbox Code Playgroud)

我已经在下面编写了该功能如何工作的示例:

# join_by_quosure(data = mtcars, left_index = vs, var_to_impute = mpg, right_index = am)

left_join(mtcars, 
          mtcars %>% select(am, mpg),
          by = c("vs" = "am"))
Run Code Online (Sandbox Code Playgroud)

如果有人能提供有关如何在left_join()函数的“ by = c()”部分中调用quosure的见解,我将不胜感激。

MrF*_*ick 9

c()函数不支持rlang bang,因此您必须采用更传统的方法来构建参数。你可以做

join_by_quosure <- function(data, left_index, var_to_impute, right_index){
  require(dplyr)

  left_index <- enquo(left_index)
  right_index <- enquo(right_index)
  var_to_impute <- enquo(var_to_impute)

  by = set_names(quo_name(right_index), quo_name(left_index))

  left_join(data, 
            data %>% select(!!right_index, !!var_to_impute),
            by = by)
}
Run Code Online (Sandbox Code Playgroud)

  • 非常好的解决方案!但我注意到 set_names() 要求 right_index 和 left_index 反向排序(即,right_index 必须列在 left_index 之前,即使在 'by = c("left_index" = "right_index")' 中使用了相反的顺序。您能解释一下为什么 set_names() 需要相反的顺序吗? (2认同)
  • 该函数的参数顺序只是值在前,名称在后。当用在管道中时它可能更有意义。但问题实际上是连接函数“滥用”命名向量表示法来指定链接列的方式。与大多数 dplyr 函数一样,当您需要实用地而不是直接使用它们时,事情会变得更加丑陋。 (2认同)