dplyr,使用带有非标准评估的过滤器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dplyr,使用带有非标准评估的过滤器相关的知识,希望对你有一定的参考价值。

我想使用dplyr中的filter()函数和动态变量名:

data(mtcars)
var1 <- 'hp'

mtcars %>% filter(hp == 110)      # works
mtcars %>% filter(var1 == 110)    # doesn't works

使用新版本的dplyr软件包,似乎可以这样做(不使用lazyeval软件包),但我无法做到这一点..有些帮助将不胜感激。

测试没有成功:

mtcars %>% filter(!!var1 == 110)
mtcars %>% filter(!!!var1 == 110)
mtcars %>% filter((!!var1) == 110)
mtcars %>% filter(quo(var1) == 110)
mtcars %>% filter(~var1 == 110)
mtcars %>% filter(quo(~var1) == 110)
var2 <- enquo(var1)

使用select()和mutate()进行成功的测试:

mtcars %>% select(!!!var1) %>% head()      # works
答案

这是一个笨拙的解决方案,只使用dplyr包,并且您可以使用带有字符输入的SE替代(以_结尾)。 (见插图(“nse”)。)

library(dplyr) 
data(mtcars)
var1 <- "hp"
mtcars %>% filter_(paste(var1, "== 110"))
另一答案

这适合我。 tidyeval here上有很多帖子

library(dplyr)

data(mtcars)

# using quotation then unquote
var1 <- quo(hp)
mtcars %>% filter(!!var1 == 110)  
#>    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> 3 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

mtcars %>% filter(UQ(var1) == 110)
#>    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> 3 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

# using sym then unquote
var2 <- rlang::sym('hp')
mtcars %>% filter(UQ(var2) == 110)
#>    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> 3 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

# put the value 110 in variable
var2 <- rlang::sym('hp')
val <- '110'
mtcars %>% filter(UQ(var2) == UQ(val))
#>    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> 3 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

reprex package创建于2018-02-28(v0.2.0)。

另一答案

可能的问题是你使用错误的filter。尝试使用dplyr::filter()代码

以上是关于dplyr,使用带有非标准评估的过滤器的主要内容,如果未能解决你的问题,请参考以下文章

带有`dplyr::count()`的标准评估[重复]

使用标准评估更改 dplyr::count 中的变量名称

使用传递给 dplyr::filter 的参数创建一个函数 解决 nse 的最佳方法是啥?

r 用dplyr进行标准评估总结。

使用 dplyr 标准化和过滤长矩阵

在带有rlang的lazyeval调用中使用二元运算符