使用data.table查找重叠区间的组

7
我有一些时间区间,需要找到哪些时间区间能够形成连续的组合。
在这个最小化实验中,我有Interval.id, Interval.start和Interval.end。 我想计算Wanted.column。
DT <- data.table(Interval.id=c(1L, 2L, 3L, 4L, 5L, 6L),
                 Interval.start=c(2.0, 3.0, 4.0, 4.6, 4.7, 5.5),
                 Interval.end=c(4.5, 3.5, 4.8, 5.0, 4.9, 8.0),
                 Wanted.column=c(1L, 1L, 1L, 1L, 1L, 2L))

我认为这里可以使用foverlaps函数,但我不知道如何使用。

如何计算Wanted.column?


1
你如何定义一个连续的组?能否详细说明如何实现所需的列?我看不出有一个序列。 - NelsonGon
1
不确定如何表达,但如果区间A与B相交,C与B相交,则A、B、C属于同一组。即使A和C不相交。 - Chris
鉴于此答案所要求的拆分数据,通过比较间隔结束和后续间隔开始之间的值(例如使用data.table::shift),应该很容易找到联合。 - Michael
2个回答

5
DT[ , g := cumsum(
  cummax(shift(Interval.end, fill = Interval.end[1])) < Interval.start) + 1]

#    Interval.id Interval.start Interval.end Wanted.column   g
# 1:           1            2.0          4.5             1   1
# 2:           2            3.0          3.5             1   1
# 3:           3            4.0          4.8             1   1
# 4:           4            4.6          5.0             1   1
# 5:           5            4.7          4.9             1   1
# 6:           6            5.5          8.0             2   2

致相关答案的致谢: 折叠具有重叠范围的行如何将重叠时间段展开/合并


3
你可以先创建一个包含唯一/分组间隔的data.table,然后使用foverlaps()执行连接。 主间隔 data.table 可以使用 intervals 包来创建。使用 interval_union() 函数将间隔合并为不重叠的间隔。
#use the intervals-package to create the "main" unique intervals
library( intervals )
DT.int <- as.data.table(
  intervals::interval_union( 
    intervals::Intervals( as.matrix( DT[, 2:3] ) ) , 
    check_valid = TRUE ) )
#set names
setnames( DT.int, names(DT.int), c("start", "end" ) )
#set group_id-column
DT.int[, group_id := .I ][]
#    start end group_id
# 1:   2.0   5        1
# 2:   5.5   8        2

#now perform foverlaps()
setkey( DT, Interval.start, Interval.end)
setkey( DT.int, start, end)
foverlaps( DT.int, DT )

#    Interval.id Interval.start Interval.end Wanted.column start end group_id
# 1:           1            2.0          4.5             1   2.0   5        1
# 2:           2            3.0          3.5             1   2.0   5        1
# 3:           3            4.0          4.8             1   2.0   5        1
# 4:           4            4.6          5.0             1   2.0   5        1
# 5:           5            4.7          4.9             1   2.0   5        1
# 6:           6            5.5          8.0             2   5.5   8        2

如您所见,列group_id与您的Wanted.column匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接