如何用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
相关产品推荐
相关产品推荐

