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

如何为tbl_hierarchical层级表添加全零行?(已实现全零列)

问题

我需要生成符合模板要求的层级不良事件(AE)表格,要求包含所有分组(包括全零行和全零列)。尝试通过给TRTA和AESOC添加不存在的因子水平来实现,结果成功生成了全零列,但全零行没有显示出来。

当前使用的代码如下:

library(gtsummary)

ADAE_subset <- cards::ADAE |>
  dplyr::filter(
    AESOC %in% unique(cards::ADAE$AESOC)[1:5],
    AETERM %in% unique(cards::ADAE$AETERM)[1:5]
  ) |>
  dplyr::mutate(TRTA = factor(TRTA, levels = c(unique(TRTA), "TRT A"))) |>
  dplyr::mutate(AESOC = factor(AESOC, levels = c(unique(AESOC), "AESOC")))

# Example 1 - Event Rates --------------------
tbl_hierarchical(
  data = ADAE_subset,
  variables = c(AESOC, AETERM),
  by = TRTA,
  denominator = cards::ADSL |> mutate(TRTA = ARM),
  id = USUBJID,
  digits = everything() ~ list(p = 1),
  overall_row = TRUE,
  label = list(..ard_hierarchical_overall.. = "Any Adverse Event")
)

当前输出

当前输出截图

预期输出

预期输出截图

解决方案

只给AESOC添加因子水平没用,因为tbl_hierarchical只会生成数据中实际存在的分组行。要得到全零行,得手动构造对应分组的空行并合并到原数据中,具体步骤如下:

  1. 从ADSL中提取所有受试者ID,构造新增AESOC分组的空行(事件数为0)
  2. 确保空行的列名、因子水平和原数据完全匹配
  3. 合并原数据和空行后再生成表格

修改后的代码:

library(gtsummary)
library(dplyr)

# 处理原数据,先给TRTA加因子水平
ADAE_subset <- cards::ADAE |>
  filter(
    AESOC %in% unique(cards::ADAE$AESOC)[1:5],
    AETERM %in% unique(cards::ADAE$AETERM)[1:5]
  ) |>
  mutate(TRTA = factor(TRTA, levels = c(unique(TRTA), "TRT A")))

# 构造新增AESOC的空行数据:给每个受试者都加一行该分组的空记录
empty_aesoc_data <- cards::ADSL |>
  mutate(
    # 匹配TRTA的因子水平
    TRTA = factor(ARM, levels = levels(ADAE_subset$TRTA)),
    # 设置新增的AESOC因子水平
    AESOC = factor("AESOC", levels = c(unique(ADAE_subset$AESOC), "AESOC")),
    AETERM = NA_character_, # 无具体事件术语,设为NA
    # 补充ADAE必需的其他列,用默认值填充
    AESEQ = 0,
    AESPID = "",
    AESTDTC = NA_character_
  ) |>
  select(all_of(names(ADAE_subset))) # 只保留原ADAE的列,避免列不匹配

# 合并原数据和空行数据
ADAE_full <- bind_rows(ADAE_subset, empty_aesoc_data)

# 生成层级表格
tbl_hierarchical(
  data = ADAE_full,
  variables = c(AESOC, AETERM),
  by = TRTA,
  denominator = cards::ADSL |> mutate(TRTA = ARM),
  id = USUBJID,
  digits = everything() ~ list(p = 1),
  overall_row = TRUE,
  label = list(..ard_hierarchical_overall.. = "Any Adverse Event")
)
关键说明
  • 空行必须包含原ADAE数据的所有列,否则合并时会报错,可根据实际ADAE结构调整补充的列
  • 新增的AESOC分组在合并后的数据中存在(每个受试者都有一行空记录),tbl_hierarchical就会生成对应的行,且事件数为0
  • TRTA的全零列不需要额外构造空行,因为分母数据中没有"TRT A",表格会自动计算为0事件数

内容的提问来源于stack exchange,提问作者Huan Lu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:17:07