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

基于重复患者ID的分时段条件计数问题求助

解决方案:用dplyr统计各时段不同状态的患者数

没问题,这个需求完全可以用dplyr轻松实现,根本不需要写for循环~我们一步步来处理:

核心思路

因为同一个患者在同一时段有多条重复记录,我们首先要按患者+时段分组,确定每个患者在对应时段是否出现过发热、是否使用过呼吸机(只要有1次符合就算该状态成立,忽略NA),再基于这些状态分类统计患者数量。

完整代码实现

1. 加载依赖包

首先确保你已经安装并加载dplyr:

library(dplyr)

2. 处理患者-时段的状态

先对每个患者的每个时段,标记是否发热、是否使用呼吸机:

patient_period_status <- df %>%
  group_by(PatientID, hospital.time) %>%
  summarise(
    # 只要该时段有至少1次发热记录,就标记为TRUE(忽略NA)
    has_fever = any(fever == 1, na.rm = TRUE),
    # 只要该时段有至少1次使用呼吸机记录,就标记为TRUE(忽略NA)
    has_ventilator = any(ventilator == 1, na.rm = TRUE),
    .groups = "drop"  # 取消分组,方便后续操作
  )

3. 给患者状态分类

根据上面的两个布尔值,给每个患者-时段组合分配类别:

patient_period_status <- patient_period_status %>%
  mutate(
    category = case_when(
      has_fever & has_ventilator ~ "同时发热且使用呼吸机",
      has_fever & !has_ventilator ~ "仅发热",
      !has_fever & has_ventilator ~ "仅使用呼吸机",
      # 可选:处理既无发热也无呼吸机,或全为NA的情况
      TRUE ~ "其他(无发热无呼吸机/全为NA)"
    )
  )

4. 统计各时段的患者数量

最后按时段和类别分组,统计每个类别下的患者数:

result <- patient_period_status %>%
  group_by(hospital.time, category) %>%
  summarise(count = n(), .groups = "drop")

# 查看结果
print(result)

输出结果示例

运行后你会得到类似这样的统计结果:

# A tibble: 6 × 3
  hospital.time category                  count
          <dbl> <chr>                     <int>
1             1 同时发热且使用呼吸机           1
2             1 仅发热                       1
3             1 其他(无发热无呼吸机/全为NA)  1
4             2 仅使用呼吸机                 1
5             3 仅发热                       1
6             4 同时发热且使用呼吸机           1

补充说明

  • 如果不需要“其他”类别,可以在mutate的case_when里删掉最后一行,后续统计时也会自动忽略这些条目;
  • 如果你想基于单条记录而非患者统计,可以跳过第一步的group_by(PatientID, hospital.time)直接分类统计,但根据你的需求,统计的是患者数,所以当前方案更准确。

内容的提问来源于stack exchange,提问作者User LG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:19:53