如何在R中制作含总体汇总的分组拆分交叉表
R实现分层+总体交叉表合并输出方案
核心实现逻辑:先给原始数据集追加一份全量副本,将副本的level字段统一赋值为「总体」,再按level字段分组批量生成交叉表合并输出即可。
主流工具实现(tidyverse + janitor)
该方案代码简洁,支持自定义输出格式(计数、百分比、检验值等)
步骤1:加载依赖包与构造示例数据
# 加载依赖包 library(tidyverse) library(janitor) # 构造示例数据(替换为你自己的数据集即可) set.seed(123) df <- tibble( level = sample(c(1,2), 1000, replace = T, prob = c(0.4,0.6)), var1 = sample(c("是","否"), 1000, replace = T), # 替换为你要做交叉表的第一个变量 var2 = sample(c("男","女"), 1000, replace = T) # 替换为你要做交叉表的第二个变量 )
步骤2:合并分组与全量数据集
df_with_total <- df %>% # 追加全量副本,level统一设为总体 bind_rows(mutate(df, level = "总体"))
步骤3:生成合并交叉表
cross_table <- df_with_total %>% group_by(level) %>% group_modify(~ tabyl(.x, var1, var2) %>% # 以下为自定义统计项,不需要可删除 adorn_percentages("row") %>% # 计算行百分比,改"col"为列百分比 adorn_pct_formatting(digits = 1) %>% # 百分比保留1位小数 adorn_ns() # 同时展示计数+百分比 ) %>% ungroup()
步骤4:格式化输出(可选,用于报告导出)
library(flextable) cross_table %>% flextable() %>% merge_v(j = "level") %>% # 合并相同level的单元格,可读性更高 theme_booktabs()
基础R实现方案(无第三方依赖)
如果不需要复杂格式,仅需要输出计数结果,可以用基础R函数实现:
# 追加全量副本 df_total <- df df_total$level <- "总体" df_all <- rbind(df, df_total) # 生成分层交叉表 ftable(xtabs(~ level + var1 + var2, data = df_all))
自定义调整说明
- 不需要百分比仅保留计数的话,删除
adorn_percentages、adorn_pct_formatting、adorn_ns三行代码即可 - 需要追加组间卡方检验结果的话,在
tabyl相关代码后追加adorn_chisq() - 要调整交叉表的变量顺序,修改
tabyl(.x, 变量1, 变量2)的参数顺序即可
内容的提问来源于stack exchange,提问作者Log On
相关产品推荐
相关产品推荐

