如何合并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
相关产品推荐
相关产品推荐

