R-如何使用参数列表过滤数据以产生多个数据框和图形

问题描述 投票:0回答:1

我正在寻找一种使用过滤器参数列表来产生不同对象的方法。我有一个数据集,我想为其制作几个图表。但是,我希望所有这些图都基于数据集的子集。为了说明目的,我提供了以下数据。

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进行一些修改使nrowlength(filters)自动化。但是,如何在grid.arrange()中获取所有生成的图?这可能应该在for循环之外,对吗?这里有什么想法吗?

r for-loop plot filter assign
1个回答
0
投票
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)

© www.soinside.com 2019 - 2024. All rights reserved.