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

如何在pivot_wider数据框中计算各组患者占总人数的百分比?

解决SAE患者数占分组总人数百分比的统计问题

可以用dplyr结合字符串格式化轻松实现需求,核心是先确保统计的是去重的患者数(而非SAE事件数),再计算占比并拼接成目标格式。

步骤说明

  1. 按分组+患者ID聚合,标记每个患者是否发生过SAE(避免同一患者多次SAE被重复计数)
  2. 统计每组的总患者数和发生SAE的患者数
  3. 用sprintf格式化出「绝对数 (百分比%)」的结果

示例代码

假设你的数据集包含以下字段:

  • randomized_group:随机分组
  • patient_id:唯一患者ID
  • sae:是否发生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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:19:59