我正在寻找一种使用过滤器参数列表来产生不同对象的方法。我有一个数据集,我想为其制作几个图表。但是,我希望所有这些图都基于数据集的子集。为了说明目的,我提供了以下数据。
df <- data.frame(type = c("b1", "b2", "b1", "b2"),
yield = c("15", "10", "5", "0"),
temperature = c("2", "21", "26", "13"),
Season = c("Winter", "Summer", "Summer", "Autumn"),
profit = c(TRUE, TRUE, FALSE, FALSE))
此外,我还有一个过滤器参数列表。
filters <- c("brand=='b1'",
"profit",
"Season=='Summer'",
"profit==FALSE",
"yield >= 10",
"")
我想要的是,我可以使用for循环让所有这些过滤器生成具有过滤数据的对象,然后绘制图形。我已经按照以下方式尝试过。
for(i in 1:length(filters)){
assign(paste0("df", i), filter(df, factor(filters[i])))
assign(paste0("plot", i), ggplot(database, aes(x = temperature, y = yield)) + geom_point())
}
但是,这不起作用,因为filter()
函数既不接受<fct>
作为参数,也不接受<chr>
(例如"brand=='b1'"
)。我想要的是brand=='b1'
,因此filter()
接受它作为参数。有人有想法吗?
此外,还有一个问题,我想使整个过程自动化,并以一个组合图结束,因此最后是grid.arrange()
。当然,可以通过对ncol
进行一些修改使nrow
和length(filters)
自动化。但是,如何在grid.arrange()
中获取所有生成的图?这可能应该在for循环之外,对吗?这里有什么想法吗?
library(dplyr)
library(ggplot2)
df <- data.frame(type = c("b1", "b2", "b1", "b2"),
yield = c(15, 10, 5, 0),
temperature = c("2", "21", "26", "13"),
Season = c("Winter", "Summer", "Summer", "Autumn"),
profit = c(TRUE, TRUE, FALSE, FALSE))
filters <- list("type=='b1'",
"profit",
"Season=='Summer'",
"profit==FALSE",
"yield >= 10",
"TRUE")
myfun <- function(fltr, df){
df <- filter(df, eval(parse(text = fltr)))
ggplot(df, aes(x = temperature, y = yield)) + geom_point()
}
lapply(filters, myfun, df = df)