You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用dplyr::group_by_生成分组汇总tibble列表(避免循环)

如何通过多组group_by_的dots参数生成汇总后的tibble列表(避免for循环)

嘿,这个需求用tidyverse里的purrr::map()就能轻松搞定,完全不用写for循环,完美契合tidyverse的函数式编程风格!

先回顾下你的基础代码(我直接沿用你写的部分):

require(tidyverse)
data(mtcars)

# 创建dplyr::group_by_函数的分组dots
dots1 <- lapply(c("am", "gear"), as.symbol)
dots2 <- lapply(c("am", "carb"), as.symbol)
l <- list(dots1, dots2)

接下来,只需要用map()遍历你的dots列表l,对每个dots元素执行分组汇总操作就行:

方法一:直接在map里写管道逻辑

# 生成汇总后的tibble列表
summary_tibbles <- map(l, ~ mtcars %>% 
                         group_by_(.dots = .x) %>% 
                         summarise(cyl_mean = mean(mpg), cyl_sd = sd(mpg)))

方法二:抽离汇总逻辑成单独函数(更易读,适合复杂场景)

如果你的汇总逻辑后续可能调整,或者代码需要更清晰,可以先定义一个专门的汇总函数:

# 定义分组汇总函数
group_and_summarise <- function(group_dots) {
  mtcars %>% 
    group_by_(.dots = group_dots) %>% 
    summarise(cyl_mean = mean(mpg), cyl_sd = sd(mpg))
}

# 用map调用函数生成列表
summary_tibbles <- map(l, group_and_summarise)

验证结果

你可以通过索引查看列表里的每个tibble,比如summary_tibbles[[1]]就是用dots1分组后的汇总结果,和你之前单组运行的结果完全一致;summary_tibbles[[2]]则对应dots2的分组汇总。

这种方式本质上是用函数式编程的思路替代了循环,map()会自动遍历列表中的每个元素,把每个dots传递给后续的处理逻辑,最后返回一个结构和输入列表l对应的tibble列表。

内容的提问来源于stack exchange,提问作者K. Fujisaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:39:43