मेरे पास एक डेटासेट है जिसमें उन स्कूलों के बारे में जानकारी शामिल है जिसमें एक छात्र ने एक शैक्षणिक वर्ष के भीतर भाग लिया है और प्रत्येक स्कूल से उनके प्रवेश और वापसी की तारीखें शामिल हैं। जबकि अधिकांश छात्र केवल एक स्कूल में जाते हैं, वहीं कुछ ऐसे भी हैं जिन्होंने चार अलग-अलग स्कूलों में भाग लिया है। मैं यह सुनिश्चित करना चाहता हूं कि कोई भी तिथि सीमा ओवरलैप न हो। नीचे मेरे पास मौजूद डेटा का एक उदाहरण है (तारीखों को तारीखों के रूप में संरचित किया गया है):

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

मैंने DescTools पैकेज में% ओवरलैप% फ़ंक्शन का उपयोग करके ऐसा करने का प्रयास किया, लेकिन यह किसी भी कॉलम के लिए लॉजिकल ऑपरेटर नहीं देता - केवल एनए। अगर कोई इस मुद्दे को हल करने में मेरी मदद कर सकता है, तो यह बहुत अच्छा होगा। और कोई अन्य सुझाव भी सहायक होगा। मैं tidyverse और आधार 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
K.C. 3 अगस्त 2020, 19:54

1 उत्तर

सबसे बढ़िया उत्तर

आप 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
1
Darren Tsai 3 अगस्त 2020, 20:02