R语言如何生成按多变量分组的中位数、均值多维交叉表
有两种常用的实现方案,不需要手动拼接列,支持任意多分组和任意多数值变量批量计算:
方法1:tidyverse 实现(代码易读,适合中小数据集)
首先加载依赖包:
library(tidyverse)
完整计算代码如下,支持自动批量处理所有需要计算中位数的数值变量,自动拼接列名:
median_table <- df %>% # 把待计算的数值列转为长格式,自动适配所有duration开头的列,新增列无需修改代码 pivot_longer( cols = starts_with("duration"), names_to = "indicator", values_to = "value" ) %>% # 合并三类分组的统计结果,新增分组维度只需要加对应分组逻辑即可 bind_rows( # 按国家+年龄组统计 group_by(., country, agegrp, indicator) %>% summarise(median = median(value, na.rm = TRUE), .groups = "drop") %>% rename(group = agegrp), # 按国家+性别统计 group_by(., country, sex, indicator) %>% summarise(median = median(value, na.rm = TRUE), .groups = "drop") %>% rename(group = sex), # 按国家统计总人群 group_by(., country, indicator) %>% summarise(median = median(value, na.rm = TRUE), .groups = "drop") %>% mutate(group = "total") ) %>% # 拼接成你需要的"国家_分组"格式列名 unite("col_name", country, group, sep = "_") %>% # 转为宽表,行是指标,列是分组 pivot_wider(names_from = col_name, values_from = median)
运行后得到的median_table就是你要求的列名格式的二维表格,可直接通过select调整列顺序。如果需要生成多级嵌套表头的可视化表格,可配合gt/flextable包对输出结果做样式渲染即可。如果需要计算均值、分位数等其他统计量,仅需把代码中的median替换为对应函数即可,整体逻辑无需调整。
方法2:data.table 实现(运行速度快,适合大样本数据集)
如果你的数据集规模较大,推荐用data.table方案,性能更高:
library(data.table) setDT(df) # 转换为data.table格式 # 转换为长表 long_dt <- melt( df, measure.vars = patterns("^duration"), variable.name = "indicator" ) # 批量计算中位数并转为宽表 median_table_dt <- dcast( rbind( # 国家+年龄组 long_dt[, .(median = median(value, na.rm = TRUE)), by = .(country, agegrp, indicator)] %>% setnames("agegrp", "group"), # 国家+性别 long_dt[, .(median = median(value, na.rm = TRUE)), by = .(country, sex, indicator)] %>% setnames("sex", "group"), # 国家总人群 long_dt[, .(median = median(value, na.rm = TRUE)), by = .(country, indicator)] %>% .[, group := "total"] ), formula = indicator ~ country + group, value.var = "median" )
内容的提问来源于stack exchange,提问作者D. Studer
相关产品推荐
相关产品推荐

