假设我有一组起点和终点,例如
0 10
8 10
10 20
10 20
25 30
40 50
45 55
我希望获得所有独特的非重叠间隔
0 8
8 10
10 20
25 30
40 45
45 50
50 55
我怎样才能在R中这样做?使用base R或任何包都应该没问题。
MWE
matrix( c(0,10,8,10,10,20,10,20,25,30,40,50,45,55),ncol=2,byrow=TRUE)
答案 0 :(得分:1)
有点天真,这似乎适用于您的具体示例:
matrix( c(0,10,8,10,10,20,10,20,25,30),ncol=2,byrow=TRUE)->mfoo
sort(unique(as.vector(mfoo)))
[1] 0 8 10 20 25 30
答案 1 :(得分:1)
此处使用bioconductor包disjoin
中的IRanges
函数的另一种解决方案:
require(IRanges)
ans = disjoin(IRanges(x[,1]+1L, x[,2])
# IRanges of length 7
# start end width
# [1] 1 8 8
# [2] 9 10 2
# [3] 11 20 10
# [4] 26 30 5
# [5] 41 45 5
# [6] 46 50 5
# [7] 51 55 5
start(ans) = start(ans)-1L
# IRanges of length 7
# start end width
# [1] 0 8 9
# [2] 8 10 3
# [3] 10 20 11
# [4] 25 30 6
# [5] 40 45 6
# [6] 45 50 6
# [7] 50 55 6
答案 2 :(得分:0)
这是使用intervals
包
x <- unique(Intervals_full(matrix( c(0,10,8,10,10,20,10,20,25,30, 40,50,45,55),ncol=2,byrow=TRUE)))
closed(x)[1:length(x)]<-FALSE
z <- interval_overlap(x,x)
y <- NULL
for(i in 1:length(z)){
if( length( z[[i]])==1){
y <- rbind(y,x[i])
}
for(j in z[[i]]){
if(i != j){
y <- rbind(y,interval_difference(x[i],x[j]),interval_intersection(x[i],x[j]))
y <- rbind(y,interval_difference(x[j],x[i]),interval_intersection(x[j],x[i]))
}
}
}
y <- unique(Intervals(y))