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

使用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

关键逻辑解释

  1. 补全全组合:用tidyr::crossing生成所有AESOC、AEDECOD和治疗组的可能组合,确保没有遗漏任何原始因子水平,这是让零计数行显示的核心步骤。
  2. 合并填充数据:通过left_join将SAE数据与全组合合并,那些没有SAE的组合会被自动补入数据,我们为这些行填充AESER="N"USUBJID=NA,确保它们不会被误计为事件,但会被tbl_hierarchical识别并显示。
  3. 锁定因子顺序:两次重置因子水平,保证表格中SOC和PT的显示顺序与原始数据完全一致,不会因为合并操作打乱顺序。

生成的表格会完整显示所有原始AESOC和AEDECOD水平,无SAE的行在所有治疗组中都会显示为0/组内总人数的格式,完全符合你的需求。

火山引擎 最新活动