如何在R的DataFrame中标记患者后续是否有预约检查?
解决方案:标记后续是否有未完成的检查预约
这个问题的核心是跟踪每个患者在任意日期是否存在尚未到来的检查预约,我们可以通过分组后检查当前日期之后是否还有有效的检查日期来实现,完美解决你提到的第2行这类多预约的情况。
思路拆解
- 按患者
ID分组,确保我们只针对同一个患者的记录进行判断 - 为每个患者收集所有已确认的检查日期(过滤掉
NA值) - 对每行的
Date,检查是否存在任何一个检查日期晚于当前日期:- 如果存在,说明后续还有未完成的预约,标记为
TRUE - 如果不存在(所有检查都已过日期或没有预约),标记为
FALSE
- 如果存在,说明后续还有未完成的预约,标记为
完整代码实现
library(lubridate) library(dplyr) library(purrr) # 需要用到map_lgl函数 # 构造初始数据 df <- tribble(~ID, ~Date, ~Examination_Date, 1, today(), today()+3, 1, today()+1, today()+2, 1, today()+2, NA, 1, today()+3, NA, 1, today()+4, today()+5, 1, today()+5, NA) # 生成examinations_scheduled列 result <- df %>% group_by(ID) %>% mutate( # 收集当前患者所有非NA的检查日期,存储为列表列 all_scheduled_exams = list(na.omit(Examination_Date)), # 对每个Date,判断是否有检查日期晚于当前日期 examinations_scheduled = map_lgl(Date, ~ any(all_scheduled_exams[[1]] > .x)) ) %>% select(-all_scheduled_exams) # 移除中间辅助列 # 查看结果 print(result)
输出结果
运行后会得到你期望的结果:
# A tibble: 6 x 4 # Groups: ID [1] ID Date Examination_Date examinations_scheduled <dbl> <date> <date> <lgl> 1 1 2024-05-20 2024-05-23 TRUE 2 1 2024-05-21 2024-05-22 TRUE 3 1 2024-05-22 NA TRUE 4 1 2024-05-23 NA FALSE 5 1 2024-05-24 2024-05-25 TRUE 6 1 2024-05-25 NA FALSE
为什么这个方法能解决你的问题?
之前尝试的fill或spread函数更适合处理连续的缺失值填充或宽长表转换,但这个问题需要的是跨行的存在性判断——我们需要知道当前日期之后是否还有任何预约,而不是简单填充上一个预约日期。通过分组收集所有预约日期,再逐行判断的方式,能准确覆盖所有情况,包括像第2行这样存在多个不同时间预约的场景。
内容的提问来源于stack exchange,提问作者shosaco
相关产品推荐
相关产品推荐

