Назначить вектор временных интервалов неперекрывающимся группам

#r #intervals #lubridate

#r #интервалы #lubridate

Вопрос:

У меня есть векторы Interval s, созданные пакетом R lubridate :

 library(lubridate)
ints <- new("Interval", .Data = c(61379.0158998966, 61379.0158998966, 
                                  174450.142500162, 2105574.12809992, 
                                  1986079.47369981), 
            start = structure(c(1477895188.5302, 1477895188.5302, 
                                1478301991.7993, 1478488100.319, 
                                1478607594.9734), 
                              tzone = "America/New_York", class = c("POSIXct", "POSIXt")), 
            tzone = "America/New_York")
ints
#> [1] 2016-10-31 02:26:28 EDT--2016-10-31 19:29:27 EDT
#> [2] 2016-10-31 02:26:28 EDT--2016-10-31 19:29:27 EDT
#> [3] 2016-11-04 19:26:31 EDT--2016-11-06 18:54:01 EST
#> [4] 2016-11-06 22:08:20 EST--2016-12-01 07:01:14 EST
#> [5] 2016-11-08 07:19:54 EST--2016-12-01 07:01:14 EST
  

Я хотел бы передать этот вектор Inteval s функции и заставить его вернуть вектор членства в группе одинаковой длины, где членство в группе определяется перекрывающимися временными интервалами. В этом примере возвращаемый вектор будет:

c(1, 1, 2, 3, 3)

lubridate способен оценивать перекрытие пар интервалов с int_overlaps помощью, но я надеюсь, что кто-то уже обобщил это, чтобы определить группы неперекрывающихся интервалов.

Ответ №1:

Мы можем использовать int_overlaps from lubridate . Идея состоит в том, чтобы проверить, есть ли какие-либо совпадения между интервалами для текущего и предыдущего ( lag ), чтобы вернуть логический вектор, который мы преобразуем в целое число с помощью cumsum

 library(lubridate)
library(dplyr)
cumsum(!int_overlaps(ints, lag(ints, default = first(ints))))   1
#[1] 1 1 2 3 3