R语言生成含交互X变量的三维频率表(带百分比)
多交互变量频率表的R实现方案
需求明确
需要生成包含2个交互分类变量(year、cat)和1个结果变量(google_cat)的频率表,要求:
- 行结构:
year为第一列,同一年份下依次展示不同cat类别 - 统计内容:包含行/列合计值,优先显示列百分比,同时可附带行百分比
- 数据集:
bgt,包含年份、题型、结果三个字段
已尝试方法的局限
- crosstable包:调整参数后无法实现
year和cat在左侧联合分组的效果,要么cat被放到表头,要么两个变量被拆分 - gmodels::CrossTable:不支持三变量交叉统计
- xtabs+ftable:仅能生成基础频数表,无法直接添加百分比统计
推荐解决方案:gtsummary包
gtsummary是专为统计描述性表格设计的R包,支持多变量分层、自定义统计量,输出格式灵活且易复用,完美匹配需求。
步骤1:安装并加载包
# 首次使用需安装 install.packages("gtsummary") library(gtsummary)
步骤2:生成目标表格
# 构建分层交叉表 freq_table <- bgt %>% # 按year做第一层分组 tbl_strata(strata = year, .tbl_fun = function(sub_data) { sub_data %>% # 以google_cat为列,cat为行变量做统计 tbl_summary( by = google_cat, include = cat, type = all_categorical() ~ "categorical", # 自定义统计格式:频数 (列百分比) [行百分比],保留0位小数 statistic = all_categorical() ~ "{n} ({p_col}%) [{p_row}%]", # 始终显示缺失值 missing = "always" ) %>% # 添加列合计 add_overall(col_label = "合计") }) %>% # 为表头添加分组标注 modify_spanning_header(all_stat_cols() ~ "**google_cat**") # 查看表格(可直接转为flextable/html/LaTeX) freq_table
效果说明
- 表格自动按
year分组,每个年份下展示所有cat类别,符合行结构要求 - 统计内容包含频数、列百分比(优先)、行百分比,格式可通过
statistic参数自由调整 - 支持缺失值展示与合计行/列,输出可直接用于报告或进一步格式化
备选方案:tableone包
如果习惯更简洁的输出,可使用tableone包:
install.packages("tableone") library(tableone) # 生成交叉表 CreateTableOne( vars = "cat", strata = c("year", "google_cat"), data = bgt, includeNA = TRUE, test = FALSE, showAllLevels = TRUE ) %>% print(quote = FALSE, noSpaces = TRUE)
内容的提问来源于stack exchange,提问作者Jacob Bradshaw
相关产品推荐
相关产品推荐

