Найдите перекрывающиеся сроки для каждой группы в R - PullRequest
1 голос
/ 26 мая 2020

R Gurus,

Мне нужна ваша помощь, чтобы определить несколько перекрывающихся временных шкал в R с помощью tidyverse / dplyr.

Вот набор данных:

library(tidyverse)
library(googleVis)

df <- data.frame(Student = structure(c(rep("Allan",5), rep("Joan",5), rep("Kat", 5)), class = "character"),
                 Course = c(LETTERS[1:5], LETTERS[1:5], LETTERS[1:5]), 
                 Start = structure(c(16713,16768,16725,16758,16780,
                                     16714,16754,16765,16729,16785,
                                     16724,16730,16755,16760,16759), class = "Date"), 
                 End = structure(c(16733,16775,16755,16779,16790,
                                   16744,16762,16780,16760,16795,
                                   16744,16750,16758,16784,16798), class = "Date"))

plot(gvisTimeline(data=df, rowlabel = "Course", 
                  start = "Start", end = "End", 
                  options=list(width=600, height=1000) ))

enter image description here Я хотел бы вычислить следующие результаты в столбце перекрытия.

df$overlap <- c("AC","BD","AC","BD","",
                "AD","BD","","ABD","",
                "AB","AB","","DE","DE")

    df


   Student Course      Start        End overlap
1    Allan      A 2015-10-05 2015-10-25      AC
2    Allan      B 2015-11-29 2015-12-06      BD
3    Allan      C 2015-10-17 2015-11-16      AC
4    Allan      D 2015-11-19 2015-12-10      BD
5    Allan      E 2015-12-11 2015-12-21        
6     Joan      A 2015-10-06 2015-11-05      AD
7     Joan      B 2015-11-15 2015-11-23      BD
8     Joan      C 2015-11-26 2015-12-11        
9     Joan      D 2015-10-21 2015-11-21      ABD
10    Joan      E 2015-12-16 2015-12-26        
11     Kat      A 2015-10-16 2015-11-05      AB
12     Kat      B 2015-10-22 2015-11-11      AB
13     Kat      C 2015-11-16 2015-11-19        
14     Kat      D 2015-11-21 2015-12-15      DE
15     Kat      E 2015-11-20 2015-12-29      DE

Мы сердечно благодарны за ваше время и помощь!

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Вы можете установить объект Interval с помощью lubridate и использовать int_overlaps(), чтобы проверить, перекрываются ли два интервала.

library(tidyverse)
library(lubridate)

df %>%
  group_by(Student) %>% 
  mutate(overlap = map_chr(interval(Start, End),
                           ~ toString(Course[int_overlaps(., interval(Start, End))])))

#    Student Course Start      End        overlap
#    <fct>   <fct>  <date>     <date>     <chr>  
#  1 Allan   A      2015-10-05 2015-10-25 A, C   
#  2 Allan   B      2015-11-29 2015-12-06 B, D   
#  3 Allan   C      2015-10-17 2015-11-16 A, C   
#  4 Allan   D      2015-11-19 2015-12-10 B, D   
#  5 Allan   E      2015-12-11 2015-12-21 E      
#  6 Joan    A      2015-10-06 2015-11-05 A, D   
#  7 Joan    B      2015-11-15 2015-11-23 B, D   
#  8 Joan    C      2015-11-26 2015-12-11 C      
#  9 Joan    D      2015-10-21 2015-11-21 A, B, D
# 10 Joan    E      2015-12-16 2015-12-26 E      
# 11 Kat     A      2015-10-16 2015-11-05 A, B   
# 12 Kat     B      2015-10-22 2015-11-11 A, B   
# 13 Kat     C      2015-11-16 2015-11-19 C      
# 14 Kat     D      2015-11-21 2015-12-15 D, E   
# 15 Kat     E      2015-11-20 2015-12-29 D, E  
2 голосов
/ 26 мая 2020

Решение, использующее map2_chr:

library(dplyr)
df %>%
  group_by(Student) %>%
   mutate(overlap = purrr::map2_chr(Start, End, 
              ~toString(Course[.x >= Start & .x < End | .y > Start & .y < End])))

#  Student    Course Start      End        overlap
#   <charactr> <chr>  <date>     <date>     <chr>  
# 1 Allan      A      2015-10-05 2015-10-25 A, C   
# 2 Allan      B      2015-11-29 2015-12-06 B, D   
# 3 Allan      C      2015-10-17 2015-11-16 A, C   
# 4 Allan      D      2015-11-19 2015-12-10 D      
# 5 Allan      E      2015-12-11 2015-12-21 E      
# 6 Joan       A      2015-10-06 2015-11-05 A, D   
# 7 Joan       B      2015-11-15 2015-11-23 B, D   
# 8 Joan       C      2015-11-26 2015-12-11 C      
# 9 Joan       D      2015-10-21 2015-11-21 A, B, D
#10 Joan       E      2015-12-16 2015-12-26 E      
#11 Kat        A      2015-10-16 2015-11-05 A, B   
#12 Kat        B      2015-10-22 2015-11-11 A, B   
#13 Kat        C      2015-11-16 2015-11-19 C      
#14 Kat        D      2015-11-21 2015-12-15 D, E   
#15 Kat        E      2015-11-20 2015-12-29 E   

При необходимости вы можете заменить односимвольные записи из столбца overlap пустым.

...