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

如何合并gtsummary生成的分层汇总表并保留两表列标题?

解决gtsummary分层表堆叠后丢失第二表列标题的问题

问题本质

tbl_stack() 默认对齐两张表的列结构,仅保留第一张表的表头信息,导致第二张表因by参数不同产生的独特列标题被覆盖丢失。要保留两张表各自的列标题,需通过调整表结构或借助其他工具实现。

方案一:为每张表添加表头行后堆叠

通过modify_table_body()将表头信息插入到每张表的顶部,再用tbl_stack()堆叠,同时保留分组标题:

library(gtsummary)
library(tidyverse)
data("diamonds")

# 构建表1并插入自定义表头行
table1 <- diamonds %>% 
  filter(cut %in% c("Ideal", "Premium") & color %in% c("E", "I")) %>%
  mutate(color = factor(color)) %>% 
  tbl_strata(strata = cut, 
             .tbl_fun = ~.x %>% tbl_summary(by = color, include = price)) %>%
  modify_table_body(
    ~ bind_rows(
      tibble(
        label = "",
        stat_0 = "Premium (E)",
        stat_1 = "Premium (I)",
        stat_2 = "Ideal (E)",
        stat_3 = "Ideal (I)"
      ),
      .x
    ) %>%
      mutate(row_type = ifelse(row_number() == 1, "header", row_type))
  )

# 构建表2并插入自定义表头行
table2 <- diamonds %>% 
  filter(cut %in% c("Ideal", "Premium") & clarity %in% c("SI1", "SI2")) %>%
  mutate(clarity = factor(clarity)) %>% 
  tbl_strata(strata = cut, 
             .tbl_fun = ~.x %>% tbl_summary(by = clarity, include = price)) %>%
  modify_table_body(
    ~ bind_rows(
      tibble(
        label = "",
        stat_0 = "Premium (SI1)",
        stat_1 = "Premium (SI2)",
        stat_2 = "Ideal (SI1)",
        stat_3 = "Ideal (SI2)"
      ),
      .x
    ) %>%
      mutate(row_type = ifelse(row_number() == 1, "header", row_type))
  )

# 堆叠两张表
tbl_stack(list(table1, table2), group_header = c("Table 1: 按Color分层", "Table 2: 按Clarity分层"))

方案二:使用gt包垂直拼接保留完整表头

将两张gtsummary表转为gt对象,用gt::vstack()垂直拼接,完整保留每张表的原始表头和格式:

library(gtsummary)
library(tidyverse)
library(gt)
data("diamonds")

# 构建表1并转为gt对象
table1 <- diamonds %>% 
  filter(cut %in% c("Ideal", "Premium") & color %in% c("E", "I")) %>%
  mutate(color = factor(color)) %>% 
  tbl_strata(strata = cut, 
             .tbl_fun = ~.x %>% tbl_summary(by = color, include = price)) %>%
  as_gt() %>%
  tab_header(title = "Table 1: 按Color分层")

# 构建表2并转为gt对象
table2 <- diamonds %>% 
  filter(cut %in% c("Ideal", "Premium") & clarity %in% c("SI1", "SI2")) %>%
  mutate(clarity = factor(clarity)) %>% 
  tbl_strata(strata = cut, 
             .tbl_fun = ~.x %>% tbl_summary(by = clarity, include = price)) %>%
  as_gt() %>%
  tab_header(title = "Table 2: 按Clarity分层")

# 垂直拼接两张gt表
gt::vstack(table1, table2)

方案说明

  • 方案一适合需要保持gtsummary格式一致性的场景,表头作为表内行存在,可通过modify_header()进一步调整样式。
  • 方案二更直观,完全保留每张表的独立表头和结构,适合需要清晰区分两张表的展示需求。

内容的提问来源于stack exchange,提问作者Martin SL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:03:20