R: Определите, перекрывается ли каждый интервал дат со всеми другими интервалами дат в кадре данных. - PullRequest
1 голос
/ 08 октября 2019

Для каждой строки интервала дат в моем фрейме данных я хотел бы определить, перекрывается ли он со всеми другими интервалами дат или нет. Исключая себя.

Фрейм данных с начальной и конечной датой, представляющий интервалы:

`data <- read.table(header=TRUE,text="
start.date             end.date
2019-09-01             2019-09-10
2019-09-05             2019-09-07
2019-08-25             2019-09-05
2019-10-10             2019-10-15
")`

Эта функция lubridate::int_overlaps() проверяет, перекрываются ли два интервала даты, возвращая логические ИСТИНА или ЛОЖЬ.

`int_overlaps(interval(ymd("2019-09-01"),ymd("2019-09-10")), interval(ymd("2019-09-05"), ymd("2019-09-07")))
[1] TRUE
int_overlaps(interval(ymd("2019-09-01"),ymd("2019-09-10")), interval(ymd("2019-10-10"), ymd("2019-10-15")))
[1] FALSE`

Я бы хотел перебрать каждый интервал дат со всеми остальными интервалами дат, исключая себя, используя int_overlap (), чтобы определить, перекрывается ли он с другой датой.

Вывод должен выглядеть следующим образомэто:

`data <- read.table(header=TRUE,text="
start.date             end.date         overlaps
2019-09-01             2019-09-10       TRUE
2019-09-05             2019-09-07       TRUE
2019-08-25             2019-09-05       TRUE
2019-10-10             2019-10-15       FALSE
")
`

1 Ответ

0 голосов
/ 08 октября 2019

Вот одна опция, использующая dplyr и purrr, мы перебираем индексы Int, сравнивая текущий интервал с другими интервалами.

library(dplyr)
library(purrr)
library(lubridate)
data %>% mutate(Int = interval(start.date, end.date), 
                overlaps = map(seq_along(Int), function(x){
                  #browser()
                  #Get all Int indexes other than the current one
                  y = setdiff(seq_along(Int), x)
                  #The interval overlaps with all other intervals
                  #return(all(int_overlaps(Int[x], Int[y])))
                  #The interval overlaps with any other intervals
                  return(any(int_overlaps(Int[x], Int[y])))
                }))

  start.date   end.date                            Int overlaps
1 2019-09-01 2019-09-10 2019-09-01 UTC--2019-09-10 UTC     TRUE
2 2019-09-05 2019-09-07 2019-09-05 UTC--2019-09-07 UTC     TRUE
3 2019-08-25 2019-09-05 2019-08-25 UTC--2019-09-05 UTC     TRUE
4 2019-10-10 2019-10-15 2019-10-10 UTC--2019-10-15 UTC    FALSE
...