将时间间隔向量分配给非重叠组

问题描述

我有由R包Interval创建的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的向量传递给一个函数,并使其返回相同长度的组成员身份矢量,其中组成员身份由重叠的时间间隔确定。在此示例中,返回的向量为:

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

lubridate能够评估间隔对与int_overlaps的重叠,但是我希望有人已经对此进行了概括,以标识出不重叠的间隔组。

解决方法

我们可以使用int_overlaps中的lubridate。想法是检查当前间隔与前一个间隔(lag)之间是否有任何重叠,以返回逻辑向量,我们用cumsum将其转换为整数

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