使用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}变量。具体步骤如下:
- 单独生成每个
PARAMCD(分层指标)和TRT01P(分组变量)组合的受试者计数ARD,用ard_count()统计唯一受试者数; - 把计数ARD和你原来的汇总ARD合并;
- 在
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工作流,方法二更灵活,你可以根据自己的需求选择。
你可以试试这两种方法,有问题随时再问~




