[英]Find groups of overlapping intervals with data.table
我有很多间隔,需要找出哪些间隔会形成一个连续的组。
在这个 MWE 中,我有 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 如何计算?
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
归功于高度相关的答案:折叠具有重叠范围的行,如何展平/合并重叠时间段
您可以首先使用唯一/分组间隔创建 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
匹配
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.