我们有两组时间间隔A
和B
。按间隔,我的意思是一对有序的整数,如c(2,5)
。我想找到所有间隔对 - 一个来自A
,一个来自B
- 有重叠。
例如,如果A和B如下:
A=c(c(1,7), c(2,5), c(4, 16))
B=c(c(2,3), c(2,20))
然后FindOverlap(A, B)
应返回如下所示的矩阵(唯一的零元素是因为A
的第3个间隔与B
的第一个间隔不重叠:
1 1
1 1
0 1
你有什么有效的想法吗?
答案 0 :(得分:6)
interval包似乎在这里提供了一个解决方案:
require("intervals")
A <- rbind(A1=c(1,7), A2=c(2,5), A3=c(4, 16))
B <- rbind(B1=c(2,3), B2=c(2,20))
# here you can also define if it is an closed or open interval
Aint <- Intervals(A)
Bint <- Intervals(B)
# that should be what you are looking for
interval_overlap(Aint, Bint)
答案 1 :(得分:1)
这是我写的一个小功能,用来做同样的事情。它可以基本进行改进。虽然有趣的问题。
f <- function(A,B){
tmpA <- lapply( A , function(x) min(x):max(x) )
tmpB <- lapply( B , function(x) min(x):max(x) )
ids <- expand.grid( seq_along( tmpA ) , seq_along( tmpB ) )
res <- mapply( function(i,j) any( tmpA[[i]] %in% tmpB[[j]] ) , i = ids[,1] , j = ids[ ,2] )
out <- matrix( res , nrow = length( tmpA ) )
return( out * 1 )
}
f(A,B)
[,1] [,2]
[1,] 1 1
[2,] 1 1
[3,] 0 1