【问题标题】:Filter() using values from variables as arguments [duplicate]Filter() 使用变量中的值作为参数[重复]
【发布时间】:2019-12-29 18:18:14
【问题描述】:

我希望能够filter(),其中参数值是已经定义的变量。

例如,使用可重现的mtcars 数据集:

library(tidyverse)
df <- mtcars
head(df)
#>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#> Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

我想使用:

filter_by <-  "cyl"
filter_equal <- 6

我尝试了以下方法,但输出的行数为零。

df %>% filter(filter_by == filter_equal)
#>  [1] mpg  cyl  disp hp   drat wt   qsec vs   am   gear carb
#> <0 rows> (or 0-length row.names)

我想要的输出是这样的(但使用变量filter_by 和filter_equal):

df %>% filter(cyl == 6)
#>    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> 1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> 2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> 3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> 4 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> 5 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> 6 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> 7 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6

由reprex package (v0.2.1) 于 2019 年 8 月 25 日创建

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    如果您想使用非标准评估 (NSE),您需要将 filter_by 转换为符号 (sym),然后评估 (!!)

    library(dplyr)
    library(rlang)
    
    df %>% filter(!!sym(filter_by) == filter_equal)
    
    #   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    #1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
    #2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    #3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    #4 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
    #5 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    #6 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
    #7 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    

    我们也可以使用get

    df %>% filter(get(filter_by) == filter_equal)
    

    base R中没有NSE,我们可以直接做

    df[df[[filter_by]] == filter_equal, ]
    

    【讨论】:

      【解决方案2】:

      我们可以使用filter_at

      library(dplyr)
      df %>%
         filter_at(vars(filter_by), any_vars(. == filter_equal))
      #   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
      #1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
      #2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
      #3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
      #4 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
      #5 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
      #6 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
      #7 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        相关资源
        最近更新 更多