[英]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::ensym
和rlang::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.