标记是否在数据框中计划了操作

时间:2018-05-17 19:49:33

标签: r dataframe dplyr tidyr

我想每天标记患者是否在接下来的几天安排检查。起点是

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::fillspread和兄弟姐妹,但遇到上述第2行的问题。

提前致谢!

1 个答案:

答案 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