如何使用R语言gt()正确格式化5维列联表?
解决5维列联表的gt格式化问题
你用tbl_strata()结合tbl_cross()的方式本质是借助gtsummary生成汇总表,若需要更贴合预期的格式,可通过两种方式实现:
方案一:修正gtsummary转gt的流程
只需调整strata参数的传入形式,并将结果转为gt对象即可:
library(dplyr) library(gtsummary) library(gt) tab <- data.frame(tab) tab.test <- tab %>% tbl_strata( strata = c(Touch.Time, Quarter, Off.Dribble), # 改为向量形式传入分层变量 .tbl_fun = ~ .x %>% tbl_cross(Zone, Closest.Defender.Distance, margin = NULL) ) %>% as_gt() # 转换为gt对象 # 可选:美化表格样式 tab.test %>% tab_header(title = "NBA 5维列联表") %>% tab_options(table.width = px(800))
方案二:直接用gt构建分层分段表格(更灵活)
这种方式可完全自定义分层展示的样式,步骤如下:
- 预处理数据
library(dplyr) library(gt) library(tidyr) library(glue) # 将列联表转为带频数的数据框 tab_df <- data.frame(tab) # 获取所有分层变量的唯一组合 strata_groups <- tab_df %>% distinct(Touch.Time, Quarter, Off.Dribble) %>% arrange(Touch.Time, Quarter, Off.Dribble)
- 循环生成分层交叉表
# 初始化空gt对象 final_table <- gt() # 遍历每个分层组合,添加对应分段 for (i in 1:nrow(strata_groups)) { current_group <- strata_groups[i, ] # 筛选当前分层数据并转为宽格式(防守距离为列,区域为行) current_data <- tab_df %>% filter(Touch.Time == current_group$Touch.Time, Quarter == current_group$Quarter, Off.Dribble == current_group$Off.Dribble) %>% pivot_wider( names_from = Closest.Defender.Distance, values_from = Freq, values_fill = 0 # 缺失频数补0 ) %>% select(Zone, everything()) # 添加分段到gt表格 final_table <- final_table %>% tab_add_section( title = glue("触球时间: {current_group$Touch.Time} | 节次: {current_group$Quarter} | 是否运球后出手: {current_group$Off.Dribble}"), data = current_data ) } # 美化表格 final_table <- final_table %>% tab_header( title = "NBA 5维列联表", subtitle = "按触球时间、节次、运球出手状态分层展示区域与防守距离的频数分布" ) %>% tab_options( section.title.font.size = 12, table.font.size = 10, section.border.top.width = px(1), section.border.top.color = "#cccccc" )
生成的表格会按每个分层组合生成独立分段,每个分段内展示对应区域与防守距离的交叉频数,结构清晰且符合5维列联表的展示逻辑。
内容的提问来源于stack exchange,提问作者Extreme_d1
相关产品推荐
相关产品推荐

