我想每天标记患者是否在接下来的几天安排检查。起点是
library(lubridate)
library(dplyr)
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)
# A tibble: 6 x 3
ID Date Examination_Date
<dbl> <date> <date>
1 1 2018-05-17 2018-05-20
2 1 2018-05-18 2018-05-19
3 1 2018-05-19 NA
4 1 2018-05-20 NA
5 1 2018-05-21 2018-05-22
6 1 2018-05-22 NA
当计划新的考试时,每天给出一行,在Examination_Date
给出一个日期。所需的结果是一列examinations_scheduled
,用于标记是否还有考试:
# A tibble: 6 x 4
ID Date Examination_Date examinations_scheduled
<dbl> <date> <date> <lgl>
1 1 2018-05-17 2018-05-20 TRUE
2 1 2018-05-18 2018-05-19 TRUE
3 1 2018-05-19 NA TRUE
4 1 2018-05-20 NA FALSE
5 1 2018-05-21 2018-05-22 TRUE
6 1 2018-05-22 NA FALSE
我怎样才能实现这一目标?我尝试过使用tidyr::fill
,spread
和兄弟姐妹,但遇到上述第2行的问题。
提前致谢!
答案 0 :(得分:0)
cummax
可以完成您需要的大部分内容,但它不能按照您的需要使用日期或NA
,因此您需要解决这个问题...
library(lubridate)
library(dplyr)
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)
df %>%
mutate(last_exam = as.integer(Examination_Date)) %>%
mutate(last_exam = if_else(is.na(last_exam), 0L, last_exam)) %>%
mutate(last_exam = cummax(last_exam)) %>%
mutate(last_exam = as_date(last_exam)) %>%
mutate(examinations_scheduled = last_exam > Date)
# # A tibble: 6 x 5
# ID Date Examination_Date last_exam examinations_scheduled
# <dbl> <date> <date> <date> <lgl>
# 1 1 2018-05-18 2018-05-21 2018-05-21 TRUE
# 2 1 2018-05-19 2018-05-20 2018-05-21 TRUE
# 3 1 2018-05-20 NA 2018-05-21 TRUE
# 4 1 2018-05-21 NA 2018-05-21 FALSE
# 5 1 2018-05-22 2018-05-23 2018-05-23 TRUE
# 6 1 2018-05-23 NA 2018-05-23 FALSE