Отметить, запланированы ли действия в кадре данных. - PullRequest
0 голосов
/ 17 мая 2018

Я хочу отмечать для каждого дня, запланированы ли у пациента обследования на последующие дни.Начальная точка -

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 выше.

Заранее спасибо!

1 Ответ

0 голосов
/ 18 мая 2018

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  
...