如何用GTSUMMARY的tbl_ard_summary实现多分组汇总表?
问题与解决方案:用ARD结合gtsummary复现分层连续变量汇总表
问题背景
已通过tbl_strata+tbl_summary实现按trt分层、每层内按grade分组的age/ttdeath连续变量汇总表,代码如下:
# Summary by TRT & GRADE trial %>% mutate(grade = paste("Grade", grade)) %>% tbl_strata( strata = trt, .tbl_fun = ~.x %>% tbl_summary( by = grade, include = c(age, ttdeath), type = c(age, ttdeath) ~ "continuous2", statistic = c(age, ttdeath) ~ c("{N_obs}", "{mean} ({sd})", "{median} ({p25}, {p75})", "{min}, {max}")) %>% add_n(), .header = "**{strata}**, N = {n}" )
尝试用CARDS包生成ARD,再结合tbl_ard_summary复现相同结果时失败。已生成ARD的代码:
# ARD table for AGE, TTDEATH by TRT & GRADE ard.cont <- ard_continuous( trial, by = c(trt, grade), variables = c(age, ttdeath)) %>% bind_ard( ard_attributes( trial, variables = c(trt, grade, age, ttdeath)))
失败的调用代码:
# Summary from ARD trial %>% tbl_strata( strata = trt, ~.x %>% tbl_ard_summary( cards = ard.cont, by = grade, include = c(age, ttdeath), type = c(age, ttdeath) ~ "continuous2", statistic = c(age, ttdeath) ~ c("{N}", "{mean} ({sd})", "{median} ({p25}, {p75})", "{min}, {max}") ))
解决方案
可以通过ARD实现需求,问题核心在于ARD数据与分层子集不匹配:tbl_strata会按trt拆分数据,但传入的ard.cont包含所有trt的完整统计,tbl_ard_summary无法自动过滤当前分层的trt,同时需保证grade的格式统一、统计项映射一致。以下是两种可行方案:
方案1:分层内生成对应ARD
在tbl_strata的每层中,针对当前trt子集生成专属ARD,避免数据不匹配:
# 用ARD复现分层汇总表 trial %>% mutate(grade = paste("Grade", grade)) %>% tbl_strata( strata = trt, .tbl_fun = ~.x %>% # 为当前分层生成对应ARD ard_continuous( by = grade, variables = c(age, ttdeath) ) %>% bind_ard(ard_attributes(.x, variables = c(grade, age, ttdeath))) %>% tbl_ard_summary( by = grade, include = c(age, ttdeath), type = c(age, ttdeath) ~ "continuous2", statistic = c(age, ttdeath) ~ c("{N_obs}", "{mean} ({sd})", "{median} ({p25}, {p75})", "{min}, {max}") ) %>% add_n(), .header = "**{strata}**, N = {n}" )
方案2:提前生成完整ARD,分层内过滤
先生成包含所有trt和grade的完整ARD,在分层内过滤出当前trt的统计数据:
# 提前生成完整ARD(统一grade格式) ard.cont <- trial %>% mutate(grade = paste("Grade", grade)) %>% ard_continuous( by = c(trt, grade), variables = c(age, ttdeath) ) %>% bind_ard( ard_attributes( trial %>% mutate(grade = paste("Grade", grade)), variables = c(trt, grade, age, ttdeath) ) ) # 分层调用时过滤当前trt的ARD数据 trial %>% mutate(grade = paste("Grade", grade)) %>% tbl_strata( strata = trt, .tbl_fun = function(x) { current_trt <- unique(x$trt) ard.cont %>% filter(across(trt, ~.x == current_trt)) %>% tbl_ard_summary( by = grade, include = c(age, ttdeath), type = c(age, ttdeath) ~ "continuous2", statistic = c(age, ttdeath) ~ c("{N_obs}", "{mean} ({sd})", "{median} ({p25}, {p75})", "{min}, {max}") ) %>% add_n() }, .header = "**{strata}**, N = {n}" )
关键注意点
- grade格式统一:在生成ARD和处理原始数据时,都要执行
mutate(grade = paste("Grade", grade)),保证分组标签一致; - 统计项映射:ARD中连续变量的样本量统计项为
N_obs,需将statistic中的{N}改为{N_obs},避免匹配失败; - ARD过滤逻辑:若提前生成完整ARD,必须在分层内过滤当前
trt的子集,否则tbl_ard_summary会加载所有trt的统计数据,导致结果混乱。
内容的提问来源于stack exchange,提问作者Ranjan Karmakar
相关产品推荐
相关产品推荐

