如何在R中高效生成含统计量与合计行的分组数据汇总表?
问题描述
我有一个记录不同年龄组(Class)在两个时期(Period)步行速度(Speed)的数据集,可复现的R代码如下:
Period<-rep(c(1,2),times=c(9,18)) Class<-rep(c("child","teen","adult","toddler","child","teen","adult"),times=c(2,3,4,3,4,5,6)) Speed<-c(2,3,3,4,5,5,4,4,6,1,0.7,0.3,1,2,3,2,2,5,5,4,2,3,5,4,6,5,4) data<-data.frame(Period,Class,Speed)
需要生成包含以下属性的汇总表:
- 按年龄组和时期划分的速度最小值(min)、最大值(max)及平均值(mean)
- 按年龄组和时期划分的速度标准误(SE)
- 各年龄组在对应时期的样本量(n)
同时需添加三行合计行:
- 时期1所有个体的速度最小值、最大值、平均值、标准误及样本量
- 时期2所有个体的对应统计量
- 两个时期所有个体的对应统计量
预期的汇总表格式如下:
Class Period mean min max SE n <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 adult 1 4.75 4 6 0.479 4 2 adult 2 4.5 3 6 0.428 2 3 child 1 2.5 2 3 0.5 3 4 child 2 2 1 3 0.408 6 5 teen 1 4 3 5 0.577 4 6 teen 2 3.6 2 5 0.678 5 7 toddler 2 0.667 0.3 1 0.203 3 8 Total.Period2 2 4 2 6 0.408 9 9 Total.Period1 1 3.06 0.3 6 0.414 18 10 Total NA 3.37 0.3 6 0.315 27
目前我通过tidyverse包结合rbind(),并使用plotrix包的std.error函数实现需求,但过程繁琐,希望找到更高效的实现方法。
高效实现方案
可以直接用tidyverse工具链完成全程操作,无需额外依赖plotrix包,通过自定义标准误函数,结合group_by()、summarize()和bind_rows()快速生成包含合计行的汇总表,代码更简洁易维护:
library(tidyverse) # 自定义标准误计算函数 se <- function(x) sd(x, na.rm = TRUE) / sqrt(length(na.omit(x))) # 生成分组统计结果 group_stats <- data %>% group_by(Class, Period) %>% summarize( mean = mean(Speed, na.rm = TRUE), min = min(Speed, na.rm = TRUE), max = max(Speed, na.rm = TRUE), SE = se(Speed), n = n(), .groups = "drop" ) # 生成时期合计行 period_totals <- data %>% group_by(Period) %>% summarize( Class = paste0("Total.Period", Period), mean = mean(Speed, na.rm = TRUE), min = min(Speed, na.rm = TRUE), max = max(Speed, na.rm = TRUE), SE = se(Speed), n = n(), .groups = "drop" ) %>% select(Class, Period, mean, min, max, SE, n) # 调整列顺序匹配分组结果 # 生成整体合计行 total_all <- data %>% summarize( Class = "Total", Period = NA_real_, mean = mean(Speed, na.rm = TRUE), min = min(Speed, na.rm = TRUE), max = max(Speed, na.rm = TRUE), SE = se(Speed), n = n(), .groups = "drop" ) # 合并所有结果并保留小数位数(可选,匹配预期格式) final_table <- bind_rows(group_stats, period_totals, total_all) %>% mutate(across(c(mean, min, max, SE), ~round(., 3))) # 查看结果 print(final_table, n = Inf)
代码说明
- 自定义标准误函数:避免依赖plotrix包,直接通过标准差除以样本量平方根计算,逻辑清晰。
- 分组统计:用
group_by(Class, Period)直接按需求分组,一次性计算所有需要的统计量。 - 合计行生成:分别按Period分组生成时期合计,再生成整体合计,最后用
bind_rows合并,无需多次手动rbind。 - 格式调整:用
mutate(across(...))统一调整小数位数,与预期格式对齐。
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

