【问题标题】:dplyr, use filter with non-standard evaluationdplyr,使用带有非标准评估的过滤器
【发布时间】:2018-02-28 16:42:32
【问题描述】:

我想使用 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

【问题讨论】:

  • 您是否考虑过改用seplyr?
  • 我第一次听说“seplyr”。我去看看,谢谢。

标签: r filter dplyr


【解决方案1】:

这是一个仅使用 dplyr 包的看起来很尴尬的解决方案,而且您可以使用带有字符输入的 SE 替代方案(以 _ 结尾)。 (见小插图(“nse”)。)

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

【讨论】:

  • 这应该是 paste0() 吗?
  • 没有理由删除空格,所以我选择了paste,但paste0 应该给出完全相同的结果。 @艾琳
【解决方案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 (v0.2.0) 于 2018 年 2 月 28 日创建。

【讨论】:

  • P.S:我喜欢这两篇博文:Link 1 & Link 2。非常容易理解。
  • 感谢您的回答。 var1
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多