R:如何将过滤器列表传递给函数

时间:2016-10-26 19:58:29

标签: r function filter dplyr

我有一个自定义过滤器列表,我需要对其进行子集化。例如,对于mtcars,我有这个列表:

 filters=c(mpg>15, wt<2, carb>2 & am==0)

我想将此列表传递给包含dplyr / pipes

的函数
fmean <- function(filter_x)   mtcars %>% filter(filter_x) %>% summarise(mean(disp))

将列表传递给fmean后的预期输出是:

subset               mean(disp)
mpg>15                  192   
wt<2                    80.2
carb>2 & am==0          324

如何获得上述输出?

编辑:感谢@alistaire找到了一个整齐的解决方案,其他人在这里回复:

 library(tidyverse)
 filters <- c("mpg > 15", "wt < 2", "carb > 2 & am==0")

 fmean <- function(filter_x)   { mtcars %>%
                                   filter_(filter_x) %>%
                                   summarise(mean(disp)) %>% 
                                   mutate(subset=filter_x) %>%
                                   select(subset, everything()) }
 filters %>% map_df(fmean)

输出:

 subset               mean(disp)
 mpg>15                  192.3   
 wt<2                    80.2
 carb>2 & am==0          324.5

3 个答案:

答案 0 :(得分:4)

实现此目的的最直接方法可能是使用purrr包,该dplyr包与tidyverse包一起成为library(tidyverse) filters <- c("mpg > 15", "wt < 2", "carb > 2 & am==0") fmean <- function(filter_x) { # Create list of means means <- filter_x %>% map(~ mtcars %>% filter_(.dots = .x) %>% summarise(mean(disp))) # Create tibble from means tibble(subset = filter_x, means = unlist(means)) } fmean(filters) 包的一部分:

filter_

此外,您希望使用filter代替FileName = Path & "\TD" & Sheets("Sheet1").Range("A1").Text & ".docx",这允许您将子集条件作为字符串而不是非引用文本传递。

答案 1 :(得分:1)

在基地R:

myContainer.RegisterType<ISettingsReader, SettingsManager>();
myContainer.RegisterType<ISettingsWriter, SettingsManager>();

答案 2 :(得分:1)

data.table方式,eval(parse())

library(data.table)
mt_dt <- data.table(mtcars)

filters <- c("mpg > 15", "wt < 2", "carb > 2 & am==0")

out <- sapply(filters, function(x){mt_dt[eval(parse(text = x)), mean(disp)]})
out
# mpg > 15           wt < 2     carb > 2 & am==0 
# 192.3115          80.2250             324.4600 

我们正在遍历我们的过滤器,并且对于每个过滤器,我们将其子集化并应用我们的聚合函数

这会生成一个命名向量,使用起来非常灵活。如果您更喜欢桌子,可以使用:

data.table(subset = names(out), `mean(disp)` = out)
#              subset mean(disp)
# 1:         mpg > 15   192.3115
# 2:           wt < 2    80.2250
# 3: carb > 2 & am==0   324.4600