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

问题描述 投票:1回答:3

我想使用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
r filter dplyr
3个回答
3
投票

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

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

2
投票

这适合我。 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)。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.