如何从汇总表批量生成单元级记录数据
程序化将汇总表转换为单元级观测数据
现有一张包含分组比例和总样本量的汇总表,需要将其扩展为单元级的观测数据(长格式DataFrame),用于统计检验。原始汇总表定义如下:
tbl_summary <- tibble( outcome = c("A (%)", "B (%)", "C (%)", "D (%)", "Total (n)"), group_1 = c(.25, .25, .125, .325, 10), group_2 = c(.50, 0.0, .325, .125, 20), group_3 = c(.10, .40, .125, .325, 40)) tbl_summary
手动编写的转换代码(如下)仅适用于固定分组和结果的场景,无法适配多变量、多分组的扩展需求:
df_simulation <- bind_rows( tibble( group = 1, outcome = c( rep("A", .25*10), rep("B", .25*10), rep("C", .125*10), rep("D", .325*10))), tibble( group = 2, outcome = c( rep("A", .50*20), rep("B", .00*20), rep("C", .325*20), rep("D", .125*20))), tibble( group = 3, outcome = c( rep("A", .10*40), rep("B", .40*40), rep("C", .125*40), rep("D", .325*40)))) df_simulation
可扩展的程序化实现方案
以下代码通过tidyverse工具链实现通用转换,无需手动修改分组或结果项:
library(tidyverse) # 1. 分离比例行和总样本量行,清理结果名称 proportion_rows <- tbl_summary %>% filter(outcome != "Total (n)") %>% mutate(outcome = str_remove(outcome, " \\(\\%\\)")) total_n <- tbl_summary %>% filter(outcome == "Total (n)") %>% pivot_longer(cols = starts_with("group_"), names_to = "group", values_to = "total") %>% mutate(group = str_remove(group, "group_") %>% as.integer()) # 2. 转换为长格式并关联样本量,生成单元级数据 expanded_data <- proportion_rows %>% pivot_longer(cols = starts_with("group_"), names_to = "group", values_to = "proportion") %>% mutate(group = str_remove(group, "group_") %>% as.integer()) %>% left_join(total_n, by = "group") %>% mutate(outcome = map2(outcome, proportion * total, ~rep(.x, .y))) %>% unnest(outcome) %>% select(group, outcome) expanded_data
代码说明:
- 数据拆分:将汇总表拆分为结果比例行和总样本量行,同时去除结果名称后的
(%)标记。 - 长格式转换:把宽格式的分组列统一转为长格式,方便批量处理每个分组的比例与样本量。
- 自动扩展:通过分组关联比例和总样本量,用
map2批量生成对应数量的结果项,最终展开为单元级观测数据。
该方案自动适配任意数量的分组和结果项,无需修改代码结构即可应对扩展场景。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

