在R中生成含分类变量各类别频数的汇总统计表
解决思路
方法1:用gtsummary包(推荐)
这个包专门针对统计摘要表格设计,对分类变量的频数展示支持非常友好,默认会展开每个类别并显示频数+百分比,完全匹配你的需求。
- 安装并加载包:
install.packages("gtsummary") library(gtsummary)
- 生成目标表格:
假设你的数据集为df,要分析的变量包含连续变量age、income,分类变量gender、education:
tbl_summary( df, include = c(age, income, gender, education), # 指定需统计的变量 type = list(age ~ "continuous", income ~ "continuous"), # 明确连续变量类型 statistic = list( continuous ~ "{mean} ({sd})", # 连续变量显示均值±标准差,可自定义格式 categorical ~ "{n} ({p}%)" # 分类变量显示频数+百分比 ) ) %>% add_overall() # 可选:添加总览行
方法2:手动整理数据+knitr::kable
如果需要极致自定义格式,可以手动提取统计量后组合成数据框,再用kable输出。
- 定义统计量提取函数:
library(dplyr) library(purrr) library(knitr) # 提取连续变量统计量(均值+标准差) get_continuous <- function(data, var) { x <- data[[var]] tibble( 变量 = var, 类别 = NA, 统计值 = paste0(round(mean(x, na.rm = T), 2), " (", round(sd(x, na.rm = T), 2), ")") ) } # 提取分类变量频数+占比 get_categorical <- function(data, var) { x <- data[[var]] table(x, useNA = "ifany") %>% as.data.frame() %>% mutate( 占比 = round(Freq / sum(Freq) * 100, 1), 统计值 = paste0(Freq, " (", 占比, "%)") ) %>% rename(类别 = x) %>% mutate(变量 = var) %>% select(变量, 类别, 统计值) }
- 组合并输出表格:
# 定义变量分组 连续变量 <- c("age", "income") 分类变量 <- c("gender", "education") # 提取并合并统计结果 连续统计 <- map_dfr(连续变量, ~get_continuous(df, .x)) 分类统计 <- map_dfr(分类变量, ~get_categorical(df, .x)) 总统计 <- bind_rows(连续统计, 分类统计) # 输出表格 kable(总统计, align = "lcc", caption = "汇总统计信息")
方法3:用flextable做样式定制
如果需要调整表格样式(比如合并单元格、自定义字体/边框),可以基于gtsummary的结果转成flextable:
install.packages("flextable") library(flextable) tbl_summary(df, include = c(age, income, gender, education)) %>% as_flextable() %>% autofit() %>% set_caption("汇总统计信息") %>% bold(part = "header") # 可选:表头加粗
内容的提问来源于stack exchange,提问作者magisterludi
相关产品推荐
相关产品推荐

