如何在gtsummary::tbl_strata()中生效modify_spanning_header()设置
在tbl_strata中保留tbl_summary的表头修改方案
要解决tbl_strata迁移tbl_summary中modify_header、modify_spanning_header等修改的问题,核心是分阶段处理表头调整,利用gtsummary的选择器适配分层后的列结构,具体操作如下:
核心思路
- 子表格内修改:在
tbl_strata的.tbl_fun参数中,针对每个分层生成的tbl_summary完成基础表头修改(包括列头、子表格跨列)。 - 整体表格修改:在
tbl_strata调用结束后,统一调整整个分层表格的跨列表头或全局样式,避免硬编码列名导致报错。
完整示例代码(基于trial数据集)
library(gtsummary) # 按grade分层,每层内按trt分组生成描述统计表格,并保留表头定制 trial %>% tbl_strata( strata = grade, .tbl_fun = function(data) { # 生成子表格并完成基础表头修改 data %>% tbl_summary( by = trt, include = c(age, marker, response), # 自定义统计量格式 statistic = list( age ~ "{mean} ({sd})", marker ~ "{median} ({p25}, {p75})", response ~ "{n} ({p}%)" ) ) %>% # 修改子表格内每个统计列的表头 modify_header(all_stat_cols() ~ "**{level}**") %>% # 给子表格的分组列设置跨列表头 modify_spanning_header(all_stat_cols() ~ "**Treatment Group**") } ) %>% # 给每个分层组设置全局跨列表头 modify_spanning_header( starts_with("grade_") ~ "**Grade {strata}**" ) %>% # 移除默认脚注(可选) modify_footnote(all_stat_cols() ~ NA) %>% # 转换为gt表格并调整宽度 as_gt() %>% gt::tab_options(table.width = "100%")
关键注意事项
- 避免硬编码列名:分层后统计列的名称会自动带上分层变量的前缀(例如
grade_I_Drug A),直接写列名会触发"找不到列"的报错,必须用all_stat_cols()、starts_with()这类选择器动态匹配。 - 子表格修改的作用范围:
.tbl_fun内部的modify_spanning_header只会作用于当前分层的子表格,tbl_strata会自动保留这些修改并组合成最终表格。 - 全局跨列设置:如果需要给整个表格的分层模块设置跨列,用
starts_with("分层变量名_")选择对应列,{strata}会自动替换为分层的具体水平(如I、II、III)。
内容的提问来源于stack exchange,提问作者marie
相关产品推荐
相关产品推荐

