一次将函数应用于数据帧列表 n 个列表元素

Apply a function to a list of dataframes n list elements at a time

我有一个包含分组变量的数据框。使用 group_split 创建数据帧列表很简单,但我想转过身来制作一个图,使用分面一次将这 5 个分组。为了可重复性,我将使用 mtcars

ldf <- mtcars %>%
  group_split(carb)

现在我对如何做相当于:

ldf[1:3] %>% 
  bind_rows( .id = "column_label") %>%
  ggplot(aes(x = disp, y = hp)) +
  geom_line()  +
  facet_wrap(carb ~ ., ncol = 1)

ldf[4:6] %>% 
  bind_rows( .id = "column_label") %>%
  ggplot(aes(x = disp, y = hp)) +
  geom_line()  +
  facet_wrap(carb ~ ., ncol = 1)

我不需要用 [1:3]、[4:6] 等手动分割列表,只需提供一个 n 值,例如 3 或 5。

首选 tidyverse 解决方案第二选择基础 r。提前谢谢你

根据评论,这是我的建议,没有 group_split:

n_per_group = 3
mtcars %>%
  mutate(
    carb_grp = as.integer(factor(carb)),
    plot_grp = (carb_grp - 1) %/% n_per_group
  ) %>%
  group_by(plot_grp) %>%
  group_map(
    ~ggplot(., aes(x = disp, y = hp)) +
       geom_line()  +
       facet_wrap(carb ~ ., ncol = 1)
  )

总的来说,我发现在 group_split 之后我可能想做的大部分事情都可以用 group_map 来完成,而且有时将数据放在一起有好处——比如方便重组,如本例所示。

我认为您应该首先查看不需要拆分的解决方案,然后 un-splitting ...但是如果您坚持使用它,那么您可以像这样对它们进行分组:

ggs <- split(ldf, (seq_along(ldf)-1) %/% 3) %>%
  lapply(function(z) {
    bind_rows(z, .id = "column_label") %>%
      ggplot(aes(x = disp, y = hp)) +
      geom_line()  +
      facet_wrap(carb ~ ., ncol = 1)
  })

(生成一个 list 的 2 gg 个对象。)