R 在data.table中查找多个范围的重叠

R 在data.table中查找多个范围的重叠,r,dataframe,data.table,overlap,R,Dataframe,Data.table,Overlap,我想找到data.table对象中给定行的多个范围的重叠部分 例如: t <- data.table(a = c(3,4,5), b = c(13,12,19)) 如果可能的话,我真的很想这样做 作为本例的输出,我希望: t <- data.table(a = c(3,4,5), b = c(13,12,19), o.l = c(5,5,5), o.r = c(12,12,12)) t以下是一个单行示例: library(data.table) dt = data.table

我想找到data.table对象中给定行的多个范围的重叠部分

例如:

t <- data.table(a = c(3,4,5), b = c(13,12,19))

如果可能的话,我真的很想这样做

作为本例的输出,我希望:

t <- data.table(a = c(3,4,5), b = c(13,12,19), o.l = c(5,5,5), o.r = c(12,12,12))

t以下是一个单行示例:

library(data.table)

dt = data.table(a = c(3,4,5), b = c(13,12,19))

dt[, c("o.l", "o.r") := as.list(range(Reduce(intersect, mapply(seq, a, b, 1))))]

dt
#    a  b o.l o.r
# 1: 3 13   5  12
# 2: 4 12   5  12
# 3: 5 19   5  12
问题的核心在哪里

dt = data.table(a = c(3,4,5), b = c(13,12,19))
dt[, Reduce(intersect, mapply(seq, a, b, 1))]
# [1]  5  6  7  8  9 10 11 12

借鉴David Aurenburg的观点,这里有另一种可能的方法:

DT[, g := c(0L, cumsum(shift(a, -1L) >= cummax(b))[-.N])][, 
    c("ol", "or") := .(max(a), min(b)), g]
数据:


检查
foverlaps
我已经使用foverlaps连接了两个data.table,但是现在不知道如何在这个上下文中应用它
data.table(a=c(3,4,5),b=c(13,12,19))[,(max(a),min(b))]
谢谢你,这个例子当然可以。我也对这个问题作了一些修改,以解释那个案例
DT[, g := c(0L, cumsum(shift(a, -1L) >= cummax(b))[-.N])][, 
    c("ol", "or") := .(max(a), min(b)), g]
DT <- data.table(a = c(3,4,5,19,20,24), b = c(13,12,19,22,23,25))
    a  b g ol or
1:  3 13 0  5 12
2:  4 12 0  5 12
3:  5 19 0  5 12
4: 19 22 1 20 22
5: 20 23 1 20 22
6: 24 25 2 24 25