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

时间:2018-02-28 16:42:32

标签: r filter 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

3 个答案:

答案 0 :(得分:3)

这对我有用。 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(v0.2.0)创建于2018-02-28。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

可能的问题是你使用了错误的filter。 使用dplyr::filter()代替

尝试使用您的代码