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

如何在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. 时期1所有个体的速度最小值、最大值、平均值、标准误及样本量
  2. 时期2所有个体的对应统计量
  3. 两个时期所有个体的对应统计量
    预期的汇总表格式如下:
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)

代码说明

  1. 自定义标准误函数:避免依赖plotrix包,直接通过标准差除以样本量平方根计算,逻辑清晰。
  2. 分组统计:用group_by(Class, Period)直接按需求分组,一次性计算所有需要的统计量。
  3. 合计行生成:分别按Period分组生成时期合计,再生成整体合计,最后用bind_rows合并,无需多次手动rbind。
  4. 格式调整:用mutate(across(...))统一调整小数位数,与预期格式对齐。

内容的提问来源于stack exchange,提问作者Cam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:46:02