R语言Tidy风格下按分组获取summary输出并整理为tibble的实现方法
实现方案
标准tidyverse流程实现
直接搭配dplyr分组 + tidyr展开的组合,完全复用base R自带的summary逻辑,不需要手动编写逐指标的计算语句:
library(dplyr) library(tidyr) data <- tibble( year = rep(2018:2021, 3), x = runif(length(year)) ) data %>% group_by(year) %>% reframe(stat = summary(x) %>% round(2)) %>% unnest_wider(stat)
核心优势
- 不需要逐行书写
min(x)、quantile(x, 0.25)这类统计计算逻辑,完全复用base Rsummary的计算规则和默认输出列名 - 不需要硬编码分组值(比如之前代码里手动指定的
2018:2021),分组列完全从原数据自动提取,后续数据更新、年份范围变化时代码不需要修改 - 流程符合tidy数据处理的常规逻辑,没有零散的
tapply、map拼接操作,可读性和可维护性更高
无tidyr依赖的极简写法
如果不想额外引入tidyr包,可以用purrr搭配dplyr实现同等效果,代码长度比之前的取巧实现缩短近一半:
library(purrr) library(dplyr) data %>% group_split(year) %>% map_dfr(~{ stats_vec <- summary(.x$x) %>% round(2) as_tibble_row(as.list(stats_vec)) %>% add_column(year = unique(.x$year), .before = 1) })
旧版dplyr兼容调整
如果使用的dplyr版本低于1.1.0,没有reframe函数,把第一段代码里的reframe替换为summarise,加上分组丢弃参数即可正常运行:
data %>% group_by(year) %>% summarise(stat = summary(x) %>% round(2), .groups = "drop") %>% unnest_wider(stat)
两种实现的输出结构和期望的tibble完全一致,列名自动匹配
summary的默认输出,不需要手动调整。
内容的提问来源于stack exchange,提问作者Fr.
相关产品推荐
相关产品推荐

