代码之家  ›  专栏  ›  技术社区  ›  Jeremy K.

filter()使用变量中的值作为参数

  •  0
  • Jeremy K.  · 技术社区  · 6 年前

    我想能够 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)

    1 回复  |  直到 6 年前
        1
  •  4
  •   Ronak Shah    6 年前

    如果要使用非标准评估(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)
    

    如果R基中没有NSE,我们可以直接执行

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