如何通过参数传递给函数中的dplyr join函数?

时间:2018-03-17 20:54:48

标签: r dplyr tidyverse rlang

我想将一个不带引号的变量名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'需要vector   参数

2 个答案:

答案 0 :(得分:1)

您需要字符串作为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&amp; set_names的RHS,我们需要使用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
相信这个answer

    if (this.platform.is('cordova')) {
    // You're on a mobile device "IOS ANDROID WINDOWS" 
    // now you can call your native plugins
  } else {
    // You're testing in a browser so you may want to use another method or run your code on a emulator
  }

答案 1 :(得分:0)

将列传递到使用"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()函数,以便在多个键上进行联接