【问题标题】:How to pass by argument to dplyr join function within a function?如何通过参数传递给函数内的 dplyr join 函数?
【发布时间】:2018-08-26 18:21:25
【问题描述】:

我想将不带引号的变量名称 x 传递给 left_join 函数。我期望的输出与我运行时相同:

left_join(mtcars, mtcars, by = c('mpg' = 'mpg'))

我正在尝试这个:

 ff <- function(x) {
      x <- enquo(x)
      left_join(mtcars, mtcars, by = c(x = x))
    }
    ff(mpg)

匹配错误(x, table, nomatch = 0L) : 'match' 需要向量 论据

【问题讨论】:

    标签: r dplyr tidyverse rlang


    【解决方案1】:

    您需要字符串作为by 的输入,因此您需要使用quo_name 打破quosure 并返回一个字符串。

    library(rlang)
    library(tidyverse)
    
    ff <- function(x) {
      x <- enquo(x)
      left_join(mtcars, mtcars, by = quo_name(x))
    }
    
    head(ff(mpg))
    #>    mpg cyl.x disp.x hp.x drat.x  wt.x qsec.x vs.x am.x gear.x carb.x cyl.y
    #> 1 21.0     6    160  110   3.90 2.620  16.46    0    1      4      4     6
    #> 2 21.0     6    160  110   3.90 2.620  16.46    0    1      4      4     6
    #> 3 21.0     6    160  110   3.90 2.875  17.02    0    1      4      4     6
    #> 4 21.0     6    160  110   3.90 2.875  17.02    0    1      4      4     6
    #> 5 22.8     4    108   93   3.85 2.320  18.61    1    1      4      1     4
    #> 6 22.8     4    108   93   3.85 2.320  18.61    1    1      4      1     4
    #>   disp.y hp.y drat.y  wt.y qsec.y vs.y am.y gear.y carb.y
    #> 1  160.0  110   3.90 2.620  16.46    0    1      4      4
    #> 2  160.0  110   3.90 2.875  17.02    0    1      4      4
    #> 3  160.0  110   3.90 2.620  16.46    0    1      4      4
    #> 4  160.0  110   3.90 2.875  17.02    0    1      4      4
    #> 5  108.0   93   3.85 2.320  18.61    1    1      4      1
    #> 6  140.8   95   3.92 3.150  22.90    1    0      4      2
    

    要将x 用于by 的LHS 和RHS,我们需要使用set_names
    感谢answer

    ff2 <- function(x) {
      x <- enquo(x)
      by = set_names(quo_name(x), quo_name(x))
      left_join(mtcars, mtcars, by = by)
    }
    
    head(ff2(mpg))
    #>    mpg cyl.x disp.x hp.x drat.x  wt.x qsec.x vs.x am.x gear.x carb.x cyl.y
    #> 1 21.0     6    160  110   3.90 2.620  16.46    0    1      4      4     6
    #> 2 21.0     6    160  110   3.90 2.620  16.46    0    1      4      4     6
    #> 3 21.0     6    160  110   3.90 2.875  17.02    0    1      4      4     6
    #> 4 21.0     6    160  110   3.90 2.875  17.02    0    1      4      4     6
    #> 5 22.8     4    108   93   3.85 2.320  18.61    1    1      4      1     4
    #> 6 22.8     4    108   93   3.85 2.320  18.61    1    1      4      1     4
    #>   disp.y hp.y drat.y  wt.y qsec.y vs.y am.y gear.y carb.y
    #> 1  160.0  110   3.90 2.620  16.46    0    1      4      4
    #> 2  160.0  110   3.90 2.875  17.02    0    1      4      4
    #> 3  160.0  110   3.90 2.620  16.46    0    1      4      4
    #> 4  160.0  110   3.90 2.875  17.02    0    1      4      4
    #> 5  108.0   93   3.85 2.320  18.61    1    1      4      1
    #> 6  140.8   95   3.92 3.150  22.90    1    0      4      2
    

    【讨论】:

      【解决方案2】:

      另一种将列传递到与"LHS" = "RHS" 进行连接的函数的方法如下所示:

      data("mtcars")
      
      library(tidyverse)
      
      function_left_join <- function(x) {
      
        mtcars %>% 
          left_join(mtcars, by = names(select(., {{x}})))
      
      }
      
      head(function_left_join(mpg))
      #>    mpg cyl.x disp.x hp.x drat.x  wt.x qsec.x vs.x am.x gear.x carb.x cyl.y
      #> 1 21.0     6    160  110   3.90 2.620  16.46    0    1      4      4     6
      #> 2 21.0     6    160  110   3.90 2.620  16.46    0    1      4      4     6
      #> 3 21.0     6    160  110   3.90 2.875  17.02    0    1      4      4     6
      #> 4 21.0     6    160  110   3.90 2.875  17.02    0    1      4      4     6
      #> 5 22.8     4    108   93   3.85 2.320  18.61    1    1      4      1     4
      #> 6 22.8     4    108   93   3.85 2.320  18.61    1    1      4      1     4
      #>   disp.y hp.y drat.y  wt.y qsec.y vs.y am.y gear.y carb.y
      #> 1  160.0  110   3.90 2.620  16.46    0    1      4      4
      #> 2  160.0  110   3.90 2.875  17.02    0    1      4      4
      #> 3  160.0  110   3.90 2.620  16.46    0    1      4      4
      #> 4  160.0  110   3.90 2.875  17.02    0    1      4      4
      #> 5  108.0   93   3.85 2.320  18.61    1    1      4      1
      #> 6  140.8   95   3.92 3.150  22.90    1    0      4      2
      

      您还可以将更多列传递给select() 函数,以便在多个键上加入

      【讨论】:

        猜你喜欢
        • 2015-03-14
        • 1970-01-01
        • 2018-01-08
        • 2017-06-06
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        相关资源
        最近更新 更多