You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用ard_summary()与tbl_ard_strata2()时在汇总表表头添加受试者计数的实现方法咨询

使用ard_summary()与tbl_ard_strata2()时在汇总表表头添加受试者计数的实现方法咨询

嗨,我完全懂你的困扰——想用ard_summary()tbl_ard_strata2()生成实验室指标的分层汇总表,但原始ARD里没包含受试者计数(N)的信息,直接用modify_header()调用{n}就报错了对吧?我给你准备了两种可行的解决方案,都能顺利在表头加上每组的受试者数量:

方法一:先给ARD补充受试者计数信息,再用内置语法修改表头

这种方法的核心是先把每组的受试者数补充到ARD数据集里,让modify_header()能识别{n}变量。具体步骤如下:

  1. 单独生成每个PARAMCD(分层指标)和TRT01P(分组变量)组合的受试者计数ARD,用ard_count()统计唯一受试者数;
  2. 把计数ARD和你原来的汇总ARD合并;
  3. tbl_ard_strata2().tbl_fun里,先过滤掉计数ARD的记录,再生成汇总表,最后调用已存在的N值修改表头。

完整代码示例:

library(gtsummary)
library(cards)
library(random.cdisc.data)
library(dplyr)
library(glue)

adlb <- cadlb

# 1. 生成每个PARAMCD+TRT01P组合的受试者计数ARD
ard_n <- adlb %>%
  group_by(PARAMCD, TRT01P) %>%
  ard_count(
    variable = USUBJID,
    statistic = ~n_distinct(.)  # 统计唯一受试者,避免重复计数
  ) %>%
  mutate(stat_name = "subject_count")  # 标记这是受试者计数的记录

# 2. 生成你原本的实验室指标汇总ARD
ard_summary <- adlb %>%
  ard_summary(
    by = TRT01P,
    strata = PARAMCD,
    variable = AVAL
  )

# 3. 合并两个ARD数据集
ard_combined <- bind_rows(ard_n, ard_summary)

# 4. 生成带N值表头的分层汇总表
rs <- tbl_ard_strata2(
  ard_combined,
  strata = c(group2, group2_level), 
  .combine_with = "tbl_stack",
  .tbl_fun = function(data_subset, ...) { 
    # 从当前分层的ARD中提取受试者计数
    n_values <- data_subset %>%
      filter(stat_name == "subject_count") %>%
      select(level, stat) %>%
      tibble::deframe()  # 转为键值对,方便后续调用
    
    data_subset %>%
      filter(stat_name != "subject_count") %>%  # 过滤计数记录,保留汇总统计
      tbl_ard_summary(
        by = TRT01P,
        type = all_continuous() ~ "continuous2",
        statistic = all_continuous() ~ c("{mean} ({sd})",
                                         "{median}",
                                         "{p25} - {p75}",
                                         "({min}, {max})")
      ) %>%
      # 用glue动态生成带N值的表头
      modify_header(
        all_stat_cols() ~ glue("**{level}**  \n**N = {n_values[[level]]}**")
      )
  }
)

rs

方法二:直接从原始数据提取N值,手动构建表头

如果不想改动ARD的结构,也可以在tbl_ard_strata2().tbl_fun内部,直接从原始的adlb数据中提取当前分层(PARAMCD)下每组的受试者数,再用glue手动拼接表头文本。这种方法更直接,不需要修改原始的汇总ARD:

完整代码示例:

library(gtsummary)
library(cards)
library(random.cdisc.data)
library(dplyr)
library(glue)

adlb <- cadlb

ard <- adlb %>%
  ard_summary(
    by = TRT01P,
    strata = PARAMCD,
    variable = AVAL
  )

rs <- tbl_ard_strata2(
  ard,
  strata = c(group2, group2_level), 
  .combine_with = "tbl_stack",
  .tbl_fun = function(data_subset, ...) { 
    # 获取当前处理的分层指标(比如某个实验室参数的PARAMCD)
    current_param <- unique(data_subset$group2_level)
    
    # 从原始数据中筛选当前分层,计算每组的唯一受试者数
    group_n <- adlb %>%
      filter(PARAMCD == current_param) %>%
      group_by(TRT01P) %>%
      summarise(n = n_distinct(USUBJID), .groups = "drop") %>%
      tibble::deframe()  # 转为键值对,键是TRT01P的水平,值是对应的N
    
    data_subset %>%
      tbl_ard_summary(
        by = TRT01P,
        type = all_continuous() ~ "continuous2",
        statistic = all_continuous() ~ c("{mean} ({sd})",
                                         "{median}",
                                         "{p25} - {p75}",
                                         "({min}, {max})")
      ) %>%
      # 手动构建带N值的表头
      modify_header(
        all_stat_cols() ~ glue("**{level}**  \n**N = {group_n[[level]]}**")
      )
  }
)

rs

小提醒

  • 这里用n_distinct(USUBJID)而不是n(),是因为实验室数据里一个受试者可能有多条记录(比如多次检测),所以要统计唯一的受试者数,避免重复计数;
  • 两种方法都用到了glue包来动态拼接文本,记得提前加载这个包;
  • 方法一更贴合gtsummary+cards的ARD工作流,方法二更灵活,你可以根据自己的需求选择。

你可以试试这两种方法,有问题随时再问~

火山引擎 最新活动