【问题标题】:R: Generate unique, non-overlapping intervalsR:生成唯一的、不重叠的间隔
【发布时间】:2014-11-07 18:02:44
【问题描述】:

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

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 88 10而不是0 10?您能否更清楚地了解如何选择区间?
  • 可能会看到包intervalssetthis question
  • 我知道intervals 包,但我找不到完全符合我要求的函数。我可能不得不写一些自定义的东西
  • 如果输入是 (0,20) 和 (5,10)。预期的输出是什么?
  • (0, 5), (5, 10), (10, 20)

标签: r intervals


【解决方案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

【讨论】:

  • 这几乎是我想要的,但它不处理没有完全重叠的情况。我添加了另一个示例间隔。我可能只需要编写一些代码。
  • 我通过您的新示例得到了您想要的结果,但您可能需要一种拒绝 30 40 的方法。我认为这并不难:尝试将我的输出与您输入的第一列进行比较,可能。
  • 我明白了,你的每一对输出都会产生所有想要的输出,但也会产生更多(正如你所说。还要注意我的新示例,它也会产生 (20,25) )。
【解决方案2】:

这是另一个使用 bioconductor 包 IRanges 中的 disjoin 函数的解决方案:

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

【讨论】:

    【解决方案3】:

    这是一个使用 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))
    

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多