Попытка определить, перекрываются ли два диапазона дат с помощью R - PullRequest
1 голос
/ 03 августа 2020

У меня есть набор данных, который включает информацию о школах, которые учащийся посещал в течение c академического года, а также даты их поступления и выхода из каждой школы. Хотя большинство учеников посещают только одну школу, есть и другие, которые посещали до четырех разных школ. Я хотел бы убедиться, что ни один из диапазонов дат не пересекается. Ниже приведен пример данных, которые у меня есть (даты структурированы как даты):

|---------------------|------------------|---------------------|------------------|  
|    entry_date_1     | withdrawal_date_1|    entry_date_2     | withdrawal_date_2|  
|---------------------|------------------|---------------------|------------------|  
|     2017-11-09      |     2018-05-24   |          NA         |         NA       |  
|---------------------|------------------|---------------------|------------------|   
|     2017-08-14      |     2017-12-15   |    2017-12-16       |    2018-05-24    |  
|---------------------|------------------|---------------------|------------------|  
|     2017-08-14      |     2018-06-01   |    2018-01-16       |    2018-03-20    |        
|---------------------|------------------|---------------------|------------------|  
|     2018-01-24      |     2018-02-25   |    2018-04-03       |    2018-05-24    |  
|---------------------|------------------|---------------------|------------------|  

В идеале мне хотелось бы иметь столбец, который дает мне такой логический оператор:

|---------------------|------------------|---------------------|------------------|------------------|  
|    entry_date_1     | withdrawal_date_1|    entry_date_2     | withdrawal_date_2|     overlap?     |  
|---------------------|------------------|---------------------|------------------|------------------|  
|     2017-11-09      |     2018-05-24   |          NA         |         NA       |       NA         |  
|---------------------|------------------|---------------------|------------------|------------------|   
|     2017-08-14      |     2017-12-15   |    2017-12-16       |    2018-05-24    |       FALSE      |  
|---------------------|------------------|---------------------|------------------|------------------|  
|     2017-08-14      |     2018-06-01   |    2018-01-16       |    2018-03-20    |       TRUE       |        
|---------------------|------------------|---------------------|------------------|------------------|  
|     2018-01-24      |     2018-02-25   |    2018-04-03       |    2018-05-24    |       FALSE      |  
|---------------------|------------------|---------------------|------------------|------------------| 

Я пробовал сделать это с помощью функции% overlaps% в пакете DescTools, но она не дает логического оператора для любого столбца - только NA. Если бы кто-нибудь мог помочь мне устранить проблему, это было бы здорово. И любые другие предложения также будут полезны. Мне удобнее всего использовать tidyverse и base R, а менее комфортно - data.table.

Ниже приведен фрагмент данных для воспроизводимого примера:

my_data <- data.frame("student_id" = 1:6, 
                      "entry_date_1" = as.Date(c("2017-11-09","2017-08-14","2017-08-14","2018-01-24","2017-10-04","2017-08-14")), 
                      "withdrawal_date_1" = as.Date(c("2018-05-24","2017-12-15","2018-06-01","2018-02-25","2017-11-11","2018-05-24")),
                      "entry_date_2" = as.Date(c(NA,"2017-12-16","2018-01-16","2018-04-03","2017-12-12",NA)), 
                      "withdrawal_date_2" = as.Date(c(NA,"2018-05-24","2018-03-20","2018-05-24","2018-05-24",NA)))

Заранее спасибо за любые помогите!

1 Ответ

1 голос
/ 03 августа 2020

Вы можете использовать int_overlaps() в lubridate.

library(dplyr)
library(lubridate)

my_data %>%
  mutate(overlap = int_overlaps(interval(entry_date_1, withdrawal_date_1),
                                interval(entry_date_2, withdrawal_date_2)))

#   student_id entry_date_1 withdrawal_date_1 entry_date_2 withdrawal_date_2 overlap
# 1          1   2017-11-09        2018-05-24         <NA>              <NA>      NA
# 2          2   2017-08-14        2017-12-15   2017-12-16        2018-05-24   FALSE
# 3          3   2017-08-14        2018-06-01   2018-01-16        2018-03-20    TRUE
# 4          4   2018-01-24        2018-02-25   2018-04-03        2018-05-24   FALSE
# 5          5   2017-10-04        2017-11-11   2017-12-12        2018-05-24   FALSE
# 6          6   2017-08-14        2018-05-24         <NA>              <NA>      NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...