繁体   English   中英

NSE 上的 Inner_join

[英]Inner_join on NSE

我想写一个 function 连接两个小标题,第二个小标题的连接列在函数的参数中指定。

我有

df1 <- tibble(NUMBER = c(1,4))
df2 <- tibble(ORDER = 1:5,
              DISORDER = 5:1,
              WORD = c("The", "quick", "brown", "fox", "jumped"))

我想

chozer(df1, df2, ORDER)
# to yield
tibble(NUMBER = c(1,4),
       DISORDER = c(5,2),
       WORD = c("The", "fox"))
# and
chozer(df1, df2, DISORDER)
# to yield
tibble(NUMBER = c(5,2),
       DISORDER = c(1,4),
       WORD = c("jumped", "quick"))

我已经尝试了几种变化

chozer <- function(df1, df2, ColName){
  aCol = enquo(ColName)
  inner_join(df1, df2, by = c(NUMBER = aCol))
}
# but they all gave errors.

我查看了 Hadley Wickham 的Advanced R ,但没有发现在连接的by子句中使用 NSE(非标准评估)的示例。

你知道如何?

您可以使用deparse(substitute(ColName))

chozer <- function(df1, df2, ColName){
    inner_join(df1, df2, by = c(NUMBER = deparse(substitute(ColName))))
  }

chozer(df1, df2, DISORDER)
# A tibble: 2 x 3
  NUMBER ORDER WORD  
   <dbl> <int> <chr> 
1      1     5 jumped
2      4     2 quick 

chozer(df1, df2, ORDER)
# A tibble: 2 x 3
  NUMBER DISORDER WORD 
   <dbl>    <int> <chr>
1      1        5 The  
2      4        2 fox  

使用rlang::ensymrlang::as_string你可以这样做:

library(dplyr)

df1 <- tibble(NUMBER = c(1,4))
df2 <- tibble(ORDER = 1:5,
              DISORDER = 5:1,
              WORD = c("The", "quick", "brown", "fox", "jumped"))

chozer <- function(df1, df2, ColName){
  aCol = ensym(ColName)
  inner_join(df1, df2, by = c(NUMBER = rlang::as_string(aCol)))
}

chozer(df1, df2, ORDER)
#> # A tibble: 2 × 3
#>   NUMBER DISORDER WORD 
#>    <dbl>    <int> <chr>
#> 1      1        5 The  
#> 2      4        2 fox

chozer(df1, df2, DISORDER)
#> # A tibble: 2 × 3
#>   NUMBER ORDER WORD  
#>    <dbl> <int> <chr> 
#> 1      1     5 jumped
#> 2      4     2 quick

https://adv-r.hadley.nz/quasiquotation.html#quasi-motivation

一个选项也是通过公共列rename和加入

library(dplyr)
chozer <- function(df1, df2, ColName){
 
    df2 %>%
      rename(NUMBER := {{ColName}}) %>%  
      inner_join(df1)
 }

-测试

> chozer(df1, df2, ORDER)
Joining, by = "NUMBER"
# A tibble: 2 × 3
  NUMBER DISORDER WORD 
   <dbl>    <int> <chr>
1      1        5 The  
2      4        2 fox  
> chozer(df1, df2, DISORDER)
Joining, by = "NUMBER"
# A tibble: 2 × 3
  ORDER NUMBER WORD  
  <int>  <dbl> <chr> 
1     2      4 quick 
2     5      1 jumped

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM