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

如何在合并后的tbl_hierarchical表中跨列引用分母计算行百分比?

用cards包实现层级表格子集列以主表行值为分母计算百分比

问题场景

现有一个由多层级表合并生成的层级结构表格:

  • 第一组列(Table 1)为整体统计值
  • 后续组列(Table 2)为其子集

需要将Table 1中对应行的数值作为Table 2所有列的分母,重新计算行级百分比(当前Table 2默认使用表头总N值作为分母)。

当前示例代码

ADAE_subset <- cards::ADAE |>
  dplyr::filter(
    AESOC %in% unique(cards::ADAE$AESOC)[1:5],
    AETERM %in% unique(cards::ADAE$AETERM)[1:5]
  )

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

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

tbl <- tbl_merge(tbls = list(tbl1, tbl2))
tbl

解决方案

步骤1:提取Table 1的行级总数值

先将Table 1转换为数据框,提取每个层级行的总计数(即需要作为Table 2分母的数值):

library(dplyr)
library(tidyr)
library(rtables)

# 转换tbl1为数据框,提取行标签和对应计数
tbl1_df <- as.data.frame(tbl1)
row_totals <- tbl1_df |>
  select(row_label, matches("^n_")) |> # 匹配计数列(根据实际输出调整列名)
  rename(total_n = matches("^n_")) # 重命名为统一的total_n列

步骤2:重新计算Table 2的百分比

将Table 2转换为数据框,合并Table 1的行级总数值,替换原有百分比计算逻辑:

# 转换tbl2为数据框
tbl2_df <- as.data.frame(tbl2)

# 合并行级总数值到Table 2数据框
merged_df <- tbl2_df |>
  left_join(row_totals, by = "row_label")

# 重新计算百分比(以Table1的行值为分母),并格式化
merged_df <- merged_df |>
  mutate(
    # 假设Table2的计数列是n_Female、n_Male,百分比列对应调整
    p_Female = (n_Female / total_n) * 100,
    p_Male = (n_Male / total_n) * 100,
    p_Female = sprintf("%.1f%%", p_Female),
    p_Male = sprintf("%.1f%%", p_Male)
  )

# 若需保留rtables格式,可将处理后的数据框重新转换为表格对象
tbl2_updated <- basic_table() |>
  split_cols_by("SEX") |>
  add_colcounts() |>
  split_rows_by("AESOC", split_fun = keep_split_levels()) |>
  split_rows_by("AETERM", split_fun = keep_split_levels()) |>
  add_overall_row("Any Adverse Event") |>
  analyze(vars = "USUBJID", funs = list(
    n = function(x) length(unique(x)),
    p = function(x, denom) (length(unique(x))/denom)*100
  ), denom = merged_df$total_n) |>
  build_table(data = ADAE_subset)

步骤3:合并表格并输出

将调整后的Table 2与原Table 1合并:

tbl_final <- tbl_merge(tbls = list(tbl1, tbl2_updated))
tbl_final

关键说明

  • 核心是对齐层级行的标签,确保Table 2的每行都能匹配到Table 1对应的行级数值
  • 若需更灵活的行级分母控制,可在生成tbl_hierarchical时,直接传入包含行级分母信息的自定义denominator数据框,替换全局分母

内容的提问来源于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 08:53:14