如何在pivot_wider数据框中计算各组患者占总人数的百分比?
解决SAE患者数占分组总人数百分比的统计问题
可以用dplyr结合字符串格式化轻松实现需求,核心是先确保统计的是去重的患者数(而非SAE事件数),再计算占比并拼接成目标格式。
步骤说明
- 按分组+患者ID聚合,标记每个患者是否发生过SAE(避免同一患者多次SAE被重复计数)
- 统计每组的总患者数和发生SAE的患者数
- 用
sprintf格式化出「绝对数 (百分比%)」的结果
示例代码
假设你的数据集包含以下字段:
randomized_group:随机分组patient_id:唯一患者IDsae:是否发生SAE(1=是,0=否)
library(dplyr) # 构造示例数据 set.seed(123) df <- tibble( randomized_group = sample(c("试验组", "对照组"), 60, replace = TRUE), patient_id = sample(1:40, 60, replace = TRUE), sae = sample(c(0, 1), 60, replace = TRUE, prob = c(0.8, 0.2)) ) # 生成SAE统计结果 sae_summary <- df %>% # 按分组和患者聚合,标记该患者是否有SAE group_by(randomized_group, patient_id) %>% summarise(has_sae = any(sae == 1), .groups = "drop_last") %>% # 统计分组总人数和SAE患者数 summarise( total_patients = n_distinct(patient_id), sae_patients = sum(has_sae), .groups = "drop" ) %>% # 格式化目标字符串 mutate( sae_result = sprintf("%d (%.1f%%)", sae_patients, (sae_patients / total_patients) * 100) ) # 查看结果 print(sae_summary)
输出示例
# A tibble: 2 × 4 randomized_group total_patients sae_patients sae_result <chr> <int> <int> <chr> 1 对照组 21 4 4 (19.0%) 2 试验组 19 3 3 (15.8%)
简化场景
如果你的数据集已经是每个患者一行(无重复患者ID),且直接标记了has_sae(是否发生SAE),可以简化代码:
sae_summary <- df %>% group_by(randomized_group) %>% summarise( total_patients = n(), sae_patients = sum(has_sae), .groups = "drop" ) %>% mutate(sae_result = sprintf("%d (%.1f%%)", sae_patients, (sae_patients/total_patients)*100))
格式调整
- 若需要保留两位小数,把
%.1f改成%.2f即可,比如得到4 (19.05%) - 若不需要小数,用
%d替换,比如sprintf("%d (%d%%)", sae_patients, round((sae_patients/total_patients)*100))
内容的提问来源于stack exchange,提问作者BdR
相关产品推荐
相关产品推荐

