dplyr函数中的多个过滤器

时间:2017-07-23 13:29:23

标签: r function dplyr

我想创建一个足够灵活的dplyr函数来获取多个过滤器。

我可以创建一个使用一个过滤器的函数:

library(tidyverse)
df <- data_frame(name = c("mike","tom","jerry"), 
                 age = c(7,8,9),
                 hair_color = c("brown", "black", "brown"),
                 town = c("NYC","NYC","SF"))

filter_fun <- function(df = df, filter_var_1, filter_1) {
     filter_var_1 <- enquo(filter_var_1)

     df %>%
       filter(UQ(filter_var_1) == filter_1) 
}
test <- filter_fun(filter_var_1 = town, filter_1 = "NYC")

此代码有效。

但是,我希望这对多个过滤器灵活。我通过https://rpubs.com/hadley/dplyr-programming阅读了一些建议,这些建议让我觉得我需要使用!!!...,但我不确定这对多个过滤条件有何影响。例如,

filter_fun <- function(df = df, filters = ..., conditions = ...) {
   filters <- quos(filters)
   conditions <- quos(conditions)
   df %>%
     filter(!!!filters == !!!conditions) -> eff
   return(eff)
}

nanna <- filter_fun(filters = c(hair_color,town), 
                    conditions = c("brown", "NYC"))

但这不起作用。错误:Error in eval(lhs, parent, parent) : promise already under evaluation: recursive default argument reference or earlier problems?

一旦解决了这个问题,我也希望能够更改过滤器的符号。例如,

filter_fun <- function(df = df, 
                       filters = ..., 
                       conditions = ..., 
                       signs = ...) {
  filters <- quos(filters)
  conditions <- quos(conditions)
  types <- quos(signs)
  df %>%
     filter(!!!filters !!!signs !!!conditions) -> eff
  return(eff)
}

nanna <- filter_fun(filters = c(hair_color,town,age), 
                    conditions = c("brown", "NYC", 8), 
                    signs = c("==", "==", "<"))

那不会工作......

谢谢!

0 个答案:

没有答案