Как рассчитать количество перекрытий по времени между 2 интервалами в таблице

Я хочу рассчитать количество времени, которое находится между временными интервалами разных строк в таблице. Вот пример того, как будет выглядеть data.frame:

x <-tibble(name = c("Person1", "Person2", "Person3", "Person4"),
           group = c("A", "A", "B", "B"),
           start = c("2020-10-01-10:00", "2020-10-01-12:00", "2020-10-01-16:00", "2020-10-01-16:00"),
           end = c("2020-10-01-16:00", "2020-10-01-18:00", "2020-10-01-20:00", "2020-10-01-23:00")) %>%
  mutate(start = lubridate::ymd_hm(start),
         end = lubridate::ymd_hm(end)) %>%
  mutate(time_interval = interval(start = start, end = end))

Я хотел бы создать еще один столбец, который отображает количество часов, в течение которых time_interval людей в каждой группе перекрываются. Я уже искал похожие вопросы и функции, но не нашел. Есть ли способ в R вычислить перекрытие по времени?

С Уважением


person FelixHRA    schedule 09.11.2020    source источник


Ответы (1)


Разве перекрытие интервалов не является разницей между самым поздним временем начала и самым ранним временем окончания (если есть какое-либо совпадение)? Это можно рассчитать так. Если перекрытия нет (= отрицательное перекрытие) возвращается 0.

require(lubridate)
x %>%
  group_by(group) %>%
  mutate(overlap = if_else(condition = max(start) < min(end), 
                           true = min(end) - max(start), 
                           false = 0))
# A tibble: 4 x 6
# Groups:   group [2]
  name    group start               end                 time_interval                                    overlap
  <chr>   <chr> <dttm>              <dttm>              <Interval>                                       <drtn> 
1 Person1 A     2020-10-01 10:00:00 2020-10-01 16:00:00 2020-10-01 10:00:00 UTC--2020-10-01 16:00:00 UTC 4 hours
2 Person2 A     2020-10-01 12:00:00 2020-10-01 18:00:00 2020-10-01 12:00:00 UTC--2020-10-01 18:00:00 UTC 4 hours
3 Person3 B     2020-10-01 16:00:00 2020-10-01 20:00:00 2020-10-01 16:00:00 UTC--2020-10-01 20:00:00 UTC 4 hours
4 Person4 B     2020-10-01 16:00:00 2020-10-01 23:00:00 2020-10-01 16:00:00 UTC--2020-10-01 23:00:00 UTC 4 hours
person AndreasM    schedule 09.11.2020