我有一个自定义过滤器列表,我需要对其进行子集化。例如,对于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
答案 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