如何在合并后的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
相关产品推荐
相关产品推荐

