我想使用 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
答案 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()
代替