如何用tbl_strata()和tbl_summary()实现双层跨列表头?
问题:使用gtsummary生成带配对t检验的分层汇总表并添加跨列表头
我的数据包含两个时间点(first、second)和两个分组(A、B),想用gtsummary包的tbl_summary()和tbl_strata()生成带配对t检验的汇总表,但没法给每组下的两个时间点添加跨列表头,同时保持原有表格结构(尤其是列顺序)不变。
可复现代码
# 创建数据集 df <- data.frame( id = rep(c(1, 2, 3), each = 4, time = 1), var_01 = sample(1:5, 12, replace = TRUE), var_02 = sample(1:5, 12, replace = TRUE), group = rep(c("A", "B"), each = 2, times = 3), time = rep(c("first", "second"), each = 1, times = 6) ) # 当前尝试的代码 df |> tbl_strata( strata = group, .tbl_fun = ~ .x |> tbl_summary( include = -id, by = time, type = contains("var") ~ "continuous", statistic = list( contains("var") ~ "{mean} ({sd})" ), missing = "no" ) |> add_difference( test = everything() ~ "paired.t.test", group = id, ), .header = "**Group {strata}**" )
当前表格效果

目标表格效果

解决方案
可以通过modify_spanning_header()为每组的时间点列添加跨列表头,同时用modify_column_order()维持原有列顺序,修改后的代码如下:
library(gtsummary) # 设置随机种子保证结果可复现 set.seed(123) df <- data.frame( id = rep(c(1, 2, 3), each = 4, time = 1), var_01 = sample(1:5, 12, replace = TRUE), var_02 = sample(1:5, 12, replace = TRUE), group = rep(c("A", "B"), each = 2, times = 3), time = rep(c("first", "second"), each = 1, times = 6) ) # 生成目标表格 df |> tbl_strata( strata = group, .tbl_fun = ~ .x |> tbl_summary( include = -id, by = time, type = contains("var") ~ "continuous", statistic = list(contains("var") ~ "{mean} ({sd})"), missing = "no" ) |> add_difference( test = everything() ~ "paired.t.test", group = id, label = "配对t检验(p值)" # 给差异列添加明确标签 ), .header = "**Group {strata}**" ) |> # 为每组的时间点列添加跨列表头 modify_spanning_header( pattern = c("time_first|time_second") ~ "**时间点**", pattern = "stat_*" ~ "{strata}" ) |> # 维持原有列顺序:Group A的first、second、p值,再Group B的对应列 modify_column_order( columns = c(stat_1_1, stat_1_2, stat_1_3, stat_2_1, stat_2_2, stat_2_3) )
关键代码说明
add_difference()添加标签:给配对t检验的p值列补充明确标签,提升表格可读性;modify_spanning_header()设置跨列:用正则表达式匹配每组下的first/second列,添加“时间点”跨列表头,同时保留分层的Group A/B作为上层跨列;modify_column_order()锁定顺序:指定列的排列顺序,确保表格结构与预期一致。
内容的提问来源于stack exchange,提问作者Til Baum
相关产品推荐
相关产品推荐

