基于重复患者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
相关产品推荐
相关产品推荐

