R:生成唯一的,不重叠的区间

时间:2014-11-07 18:02:44

标签: r intervals

假设我有一组起点和终点,例如

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)

3 个答案:

答案 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))