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,使用带有非标准评估的过滤器的主要内容,如果未能解决你的问题,请参考以下文章