使用gtsummary::tbl_hierarchical生成安全表时,如何强制显示所有因子水平(含零计数行)?
gtsummary::tbl_hierarchical生成安全表时,如何强制显示所有因子水平(含零计数行)?
我完全理解你的需求——你想生成一张包含所有原始AESOC(器官系统分类)和AEDECOD(不良反应术语)因子水平的严重不良事件(SAE)层级表,哪怕某些水平在所有治疗组中都没有事件(计数为0)。你之前尝试重新指定因子水平但没起作用,核心原因是:tbl_hierarchical只会显示数据中实际存在的行,而你过滤掉非SAE事件后,那些没有SAE的SOC/PT组合已经从adae中消失了,仅重新指定因子水平不足以让它们出现在表格里。
下面是完整的可运行解决方案,核心是在预处理阶段补全所有缺失的SOC/PT/治疗组组合,确保每个因子水平都有对应的行(哪怕事件数为0):
# Load packages & data ------------------------------------- library(dplyr) library(gtsummary) library(tidyr) # 新增:用于补全缺失的因子组合 adsl <- random.cdisc.data::cadsl adae <- random.cdisc.data::cadae # Capture factor levels ------------------------------------ # 捕获所有原始因子水平,包括无SAE的水平 lev_soc <- levels(adae[["AESOC"]]) lev_decod <- levels(adae[["AEDECOD"]]) lev_arm <- levels(adsl[["ARM"]]) # 捕获治疗组所有水平 # Pre-processing -------------------------------------------- # 1. 先过滤出SAE并重置因子水平 adae_sae <- adae %>% filter(AESER == "Y") %>% # 仅保留严重不良事件 mutate( AESOC = factor(AESOC, levels = lev_soc), AEDECOD = factor(AEDECOD, levels = lev_decod), ARM = factor(ARM, levels = lev_arm) ) # 2. 创建所有AESOC-AEDECOD-ARM的全组合(补全缺失的水平) all_combinations <- crossing( AESOC = lev_soc, AEDECOD = lev_decod, ARM = lev_arm ) # 3. 合并SAE数据与全组合,补全缺失行并填充默认值 adae_complete <- all_combinations %>% left_join(adae_sae, by = c("AESOC", "AEDECOD", "ARM")) %>% # 为补全的无事件行填充必要字段,不影响后续计数逻辑 mutate( AESER = coalesce(AESER, "N"), USUBJID = coalesce(USUBJID, NA_character_) ) %>% # 再次确认因子水平,避免合并后顺序错乱 mutate( AESOC = factor(AESOC, levels = lev_soc), AEDECOD = factor(AEDECOD, levels = lev_decod), ARM = factor(ARM, levels = lev_arm) ) # Generate table --------------------------------------------- tbl <- adae_complete |> tbl_hierarchical( variables = c(AESOC, AEDECOD), by = ARM, id = USUBJID, denominator = adsl, overall_row = TRUE, label = "..ard_hierarchical_overall.." ~ "Any SAE" ) # 查看最终表格 tbl
关键逻辑解释
- 补全全组合:用
tidyr::crossing生成所有AESOC、AEDECOD和治疗组的可能组合,确保没有遗漏任何原始因子水平,这是让零计数行显示的核心步骤。 - 合并填充数据:通过
left_join将SAE数据与全组合合并,那些没有SAE的组合会被自动补入数据,我们为这些行填充AESER="N"和USUBJID=NA,确保它们不会被误计为事件,但会被tbl_hierarchical识别并显示。 - 锁定因子顺序:两次重置因子水平,保证表格中SOC和PT的显示顺序与原始数据完全一致,不会因为合并操作打乱顺序。
生成的表格会完整显示所有原始AESOC和AEDECOD水平,无SAE的行在所有治疗组中都会显示为0/组内总人数的格式,完全符合你的需求。




