0

我正在尝试通过编写一个函数来自动化我的条形图,该函数将采用不同的数据集以及 x 和 y 轴值。

由于该函数具有三个参数(数据集、x 轴和 y 轴),因此我使用的是 purrr 中的 pmap()。

当我删除数据集参数并使用 map2() 而不是 pmap() 时,该函数工作正常

这是我写的代码:

forest_day <- forest %>% group_by(day) %>% summarise(n())%>%rename(count1 = `n()`)
forest_month <- forest %>% group_by(month) %>% summarise(n())%>%rename(count1 = `n()`)

pbar <- function(data, x, y) {
  ggplot(data = data) + aes_string(x = x, y = y) + geom_bar(stat = 'identity')
}

l1 <- list(forest_month, forest_month$month, forest_month$count1)
pmap(l1, pbar)
l2 <- list(forest_day, forest_day$day, forest_day$count1)
pmap(l2,pbar)

我在使用 pmap() 时得到的错误代码是这样的:

“元素 1 的.l长度必须为 1 或 12,而不是 2”

提前感谢您的帮助!

4

1 回答 1

1

由于我没有您的数据,因此我使用mtcars和生成我自己的数据集irisget(data)在您的 ggplot 调用中使用应该可以解决您的问题。请注意,您需要将所有参数作为字符串提供。aes_string因此,在您自己的示例中,您已经使用x并且y应该作为字符串提供。Usingget将字符串作为参数并在全局环境中查找对象。

library(dplyr)
library(ggplot2)
library(purrr)

mtcars_cyl <- mtcars %>% group_by(cyl) %>% summarise(count1 = n())
iris_Species <- iris %>% group_by(Species) %>% summarise(count1 = n())

pbar <- function(data, x, y) {
  ggplot(data = get(data), aes_string(x = x, y = y)) + geom_bar(stat = 'identity')
}

l1 <- list("mtcars_cyl","cyl", "count1")
pmap(l1, pbar)
map2("cyl", "count1" )
l2 <- list("iris_Species", "Species", "count1")
pmap(l2,pbar)

如果您总是使用相同的 y-variable count1。然后你可以使用map2. 这是一个有两个列表的示例。一个列表 ,ls_data提供要循环的数据帧和一个列表,ls_x,提供 x 参数ggplot2count1然后在 lambda 函数内部定义map2。Callingmap2同时生成了两个图。或者walk2将生成绘图而不打印[[1]] [[2]]到控制台。

ls_data <- list("mtcars_cyl","iris_Species")
ls_x <- list("cyl","Species")

map2(ls_data, ls_x, ~ pbar(.x, .y, "count1"))
walk2(ls_data, ls_x, ~ pbar(.x, .y, "count1"))

调用 map2 的另一种方法是将两个参数放在一个命名列表中,数据集的名称作为列表名称,x 参数作为列表输入。

args <- c(mtcars_cyl = "cyl",
          iris_Species = "Species")

map2(names(args), args, ~ pbar(.x, .y, "count1"))

祝你数据好运。

于 2019-06-15T08:41:04.197 回答