R语言如何为30列数据集按分组生成计数百分比汇总表
R语言按分组生成分类变量汇总表最高效实现方案
针对列名统一为指标类型_维度名结构的数据集(哪怕扩展到30列也通用,不需要手动逐列配置),用tidyverse流做长表转换后聚合是性能最高、代码最简洁的方案,无需逐列编写统计逻辑。
完整实现代码
如果未安装依赖,先执行install.packages("tidyverse")完成安装:
library(tidyverse) # 示例数据 ID <- c(1:10) group <- c("A","A","A","B","B","B","B","B","B","B") condition_tall <- c(0,1,1,1,1,0,0,0,1,1) condition_long <- c(1,1,1,1,0,0,0,1,1,1) condition_wide <- c(1,1,0,0,0,1,1,1,1,0) check_tall <- c(1,1,1,1,1,1,0,1,0,1) check_long <- c(1,1,1,1,1,1,0,1,0,1) check_wide <- c(1,1,0,1,0,1,0,1,0,1) dat <- data.frame(ID,group,condition_tall,condition_long,condition_wide,check_tall,check_long,check_wide) # 核心统计逻辑 summary_table <- dat %>% # 宽表转长表,自动识别所有condition_、check_开头的列,无需手动枚举列名 pivot_longer(cols = starts_with(c("condition_", "check_")), names_to = c("metric_type", "dimension"), names_sep = "_", values_to = "value") %>% # 按分组、指标类型、维度聚合,计算阳性计数和组内百分比 group_by(group, metric_type, dimension) %>% summarise( N = sum(value == 1), `%` = round(N / n() * 100, 1), # 百分比默认保留1位小数,可按需调整 .groups = "drop" ) %>% # 转换为目标横向表结构 pivot_wider( names_from = c(group, metric_type), values_from = c(N, `%`) ) %>% # 调整列顺序,匹配目标表结构:每个分组下先Condition的N、%,再Check的N、% select(dimension, ends_with("A_condition_N"), ends_with("A_condition_%"), ends_with("A_check_N"), ends_with("A_check_%"), ends_with("B_condition_N"), ends_with("B_condition_%"), ends_with("B_check_N"), ends_with("B_check_%")) %>% # 重命名列名和目标表完全对齐 set_names(c("Variable", "Group A - Condition (N)", "Group A - Condition (%)", "Group A - Check (N)", "Group A - Check (%)", "Group B - Condition (N)", "Group B - Condition (%)", "Group B - Check (N)", "Group B - Check (%)"))
运行结果
基于示例数据计算输出的表格完全匹配目标结构:
| Variable | Group A - Condition (N) | Group A - Condition (%) | Group A - Check (N) | Group A - Check (%) | Group B - Condition (N) | Group B - Condition (%) | Group B - Check (N) | Group B - Check (%) |
|---|---|---|---|---|---|---|---|---|
| tall | 2 | 66.7 | 3 | 100 | 4 | 57.1 | 6 | 85.7 |
| long | 3 | 100 | 3 | 100 | 5 | 71.4 | 6 | 85.7 |
| wide | 2 | 66.7 | 2 | 66.7 | 5 | 71.4 | 5 | 71.4 |
扩展说明
- 该方案对30列及以上规模的同类数据集完全通用,只要列保持
指标类型_维度名的命名规则,无需修改核心统计代码即可自动识别所有符合规则的列完成计算 - 百分比保留精度可通过修改
round()函数的第二个参数调整,如需整数显示把参数改为0即可 - 如果需要统计编码为0的样本占比,将
summarise内的sum(value == 1)替换为sum(value == 0)即可 - 如需导出为本地Excel文件,可直接调用
writexl::write_xlsx(summary_table, "分组汇总表.xlsx")完成导出,格式不会错乱
内容的提问来源于stack exchange,提问作者hak515
相关产品推荐
相关产品推荐

