如何以编程方式提供要通过dplyr和filter应用的筛选器列表_

如何以编程方式提供要通过dplyr和filter应用的筛选器列表_,r,dplyr,R,Dplyr,我想创建一个要应用于数据帧的过滤器列表。比如: filters = list(cyl=4, am=1) 然后将其应用于“mtcars”数据帧,以仅获取cyl=4和am=1的记录。我可以这样做: filter_(mtcars, lazyeval::interp(~ val == var, val = as.name(names(filters[1])), var = filters[[1]]))

我想创建一个要应用于数据帧的过滤器列表。比如:

filters = list(cyl=4, am=1)
然后将其应用于“mtcars”数据帧,以仅获取cyl=4和am=1的记录。我可以这样做:

filter_(mtcars, 
        lazyeval::interp(~ val == var, val = as.name(names(filters[1])), 
                                       var = filters[[1]]))
但这只会拾取过滤器列表中的第一个条目

应用所有过滤器的惯用方法是什么

(我正在尝试创建一个有点通用的函数,它可以接受一个数据帧和一个标准集,并将输出转换。现在,对于标准来说,相等是好的,但是更通用的习惯用法会更好)

将过滤器定义为

filter1 <- ~(cyl==4 & am==1)
函数的示例:

get_cars_with_filter <- function(my_filter) {
  mtcars %>% filter_(lazy(my_filter))
}

get_cars_with_filter(cyl==4 & am == 1)
get_cars_with_filter%filter_(lazy(my_filter))
}
使用过滤器获取车辆(cyl==4&am==1)
数据myfunction(cyl==4&am==1)
mpg气缸显示hp drat wt qsec与am齿轮carb
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 4 1
菲亚特128 32.4 78.7 66 4.08 2.200 19.47 1 4 1
本田思域30.4 4 75.7 52 4.93 1.615 18.52 1 4 2
丰田花冠33.9 4 71.1 65 4.22 1.835 19.90 1 4 1
菲亚特X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 4 1
保时捷914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
莲花欧罗巴30.4 4 95.1 113 3.77 1.513 16.90 1 5 2
沃尔沃142E 21.4 4 121.0 109 4.11 2.780 18.60 1 4 2

这里的所有答案都很好,但如果您严格希望保留最初定义过滤器的方式(通过列表),您只需将其转换为字符串并将其传递给
过滤器即可

filter_(mtcars, paste(names(filters), filters, sep = "==", collapse = "&"))

(另外一个好处是,这允许在使用逻辑运算符方面具有灵活性,例如可以将collapse更改为“|”等)

我想让函数的客户端能够在调用函数时定义过滤器。客户端A可能希望在cyl和am上进行过滤,但客户端B可能希望在cyl和vs上进行过滤。例如,接受了这一个B/c,它遵循了我拍摄的API。谢谢
mtcars %>% filter_(filter1)
get_cars_with_filter <- function(my_filter) {
  mtcars %>% filter_(lazy(my_filter))
}

get_cars_with_filter(cyl==4 & am == 1)
    data <- mtcars
    attach(data)

    ##function to create data subset applying necessary filters
     myfunction <- function(myfilter){
     newdata <- data[myfilter,]
     print(newdata)
     }

     ##calling function
     myfunction(cyl==4 & am==1)
     myfunction(mpg >20 & gear > 1)


     Output
    > myfunction(cyl==4 & am==1)

                   mpg    cyl  disp   hp drat wt    qsec  vs am gear carb
    Datsun 710     22.8   4    108.0  93 3.85 2.320 18.61  1  1    4    1
    Fiat 128       32.4   4    78.7   66 4.08 2.200 19.47  1  1    4    1
    Honda Civic    30.4   4    75.7   52 4.93 1.615 18.52  1  1    4    2
    Toyota Corolla 33.9   4    71.1   65 4.22 1.835 19.90  1  1    4    1
    Fiat X1-9      27.3   4    79.0   66 4.08 1.935 18.90  1  1    4    1
    Porsche 914-2  26.0   4    120.3  91 4.43 2.140 16.70  0  1    5    2
    Lotus Europa   30.4   4    95.1   113 3.77 1.513 16.90 1  1    5    2
    Volvo 142E     21.4   4    121.0  109 4.11 2.780 18.60 1  1    4    2 
filter_(mtcars, paste(names(filters), filters, sep = "==", collapse = "&"))