You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 02:59:51