如何用rtables实现同ARM行内以Group1为分母计算Group2占比
解决rtables中Group2占比以同ARM同组Group1为分母的问题
要实现Group2占比以同ARM-国家-站点分组下的Group1数值为分母的需求,核心是提前获取分组分母并在rtables的统计逻辑中手动调用,而非依赖默认的自身分母计算。以下是具体实现步骤:
1. 预处理数据,提取分组分母
先用dplyr筛选出每个ARM-国家-站点分组下Group1的计数,作为后续计算的分母,再关联回原数据:
library(dplyr) library(rtables) # 假设原始数据框为df,包含字段:ARM, Country, Site, Group, Count # 提取各分组的Group1计数作为分母 denominator_df <- df %>% filter(Group == "Group1") %>% group_by(ARM, Country, Site) %>% summarise(Group1_Count = first(Count), .groups = "drop") # 将分母关联到原数据的所有行 df_joined <- df %>% left_join(denominator_df, by = c("ARM", "Country", "Site"))
2. 自定义rtables统计函数
rtables默认的占比计算逻辑无法直接引用外部分母,因此需要自定义统计函数,从关联后的数据中获取Group1分母计算占比:
# 自定义函数:返回计数+占比(占比=当前Group计数/同分组Group1计数) calc_group_pct <- function(x, .df_row) { current_count <- sum(x) # 从当前分组数据中提取Group1的计数 group1_denom <- .df_row$Group1_Count %>% unique() %>% first() # 避免除以0的情况 pct <- if (group1_denom == 0) 0 else (current_count / group1_denom) * 100 # 格式化输出,比如"12 (30.0%)" paste0(current_count, " (", sprintf("%.1f%%", pct), ")") }
3. 构建并生成表格
在构建表格布局时,通过analyze调用自定义函数,利用.df_row参数获取当前分组的完整数据,从而拿到Group1分母:
# 构建表格布局 table_layout <- basic_table() %>% split_cols_by("ARM") %>% split_rows_by("Country") %>% split_rows_by("Site") %>% split_cols_by("Group") %>% analyze( var = "Count", func = calc_group_pct, extra_args = list(.df_row = .df_row) ) # 生成最终表格 final_table <- build_table(table_layout, df_joined) print(final_table)
关键逻辑说明
- 预处理阶段的
left_join确保每个Group2的行都能获取到同分组下Group1的计数,为后续计算提供数据基础。 - 自定义统计函数中,
.df_row是rtables提供的参数,代表当前分组的所有行数据,通过它可以直接提取Group1的分母值。 - 加入了除以0的判断,避免出现计算错误。
运行上述代码后,Group2的占比将以同ARM-国家-站点的Group1数值为分母计算,完全符合你的期望输出。
内容的提问来源于stack exchange,提问作者Huan Lu
相关产品推荐
相关产品推荐

