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

如何用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}"
  )

关键注意点

  1. grade格式统一:在生成ARD和处理原始数据时,都要执行mutate(grade = paste("Grade", grade)),保证分组标签一致;
  2. 统计项映射:ARD中连续变量的样本量统计项为N_obs,需将statistic中的{N}改为{N_obs},避免匹配失败;
  3. ARD过滤逻辑:若提前生成完整ARD,必须在分层内过滤当前trt的子集,否则tbl_ard_summary会加载所有trt的统计数据,导致结果混乱。

内容的提问来源于stack exchange,提问作者Ranjan Karmakar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:24:51