检查R中是否有两个间隔重叠

时间:2016-02-20 13:40:19

标签: r range intervals

给定四列(FromUp,ToUp,FromDown,ToDown)中的值,其中两列始终定义一个范围(FromUp,ToUp和FromDown,ToDown)。如何测试两个范围是否重叠。重要的是要声明范围值没有排序,因此“From”值可以高于“To”值,反之亦然。

一些示例数据:

FromUp<-c(5,32,1,5,15,1,6,1,5)
ToUp<-c(5,31,3,5,25,3,6,19,1)

FromDown<-c(1,2,8,1,22,2,1,2,6)
ToDown<-c(4,5,10,6,24,4,1,16,2)

ranges<-data.frame(FromUp,ToUp,FromDown,ToDown)

结果如下:

FromUp ToUp FromDown ToDown   Overlap
      5    5        1      4    FALSE
     32   31        2      5    FALSE
      1    3        8     10    FALSE
      5    5        1      6    TRUE
     15   25       22     24    TRUE
      1    3        2      4    TRUE
      6    6        1      1    FALSE
      1   19        2     16    TRUE
      5    1        6      2    TRUE

我尝试了观察事物,但没有让它发挥作用,特别是间隔没有“排序”的事情使得我的R技能难以找到解决方案。 我虽然要找到列对的最小值和最大值(例如FromUp,ToUp)而不是比较它们?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

对它们进行排序

rng = cbind(pmin(ranges[,1], ranges[,2]), pmax(ranges[,1], ranges[,2]),
            pmin(ranges[,3], ranges[,4]), pmax(ranges[,3], ranges[,4]))

并写下条件

olap = (rng[,1] <= rng[,4]) & (rng[,2] >= rng[,3])

一步可能是

(pmin(ranges[,1], ranges[,2]) <= pmax(ranges[,3], ranges[,4])) &
    (pmax(ranges[,1], ranges[,2]) >= pmin(ranges[,3], ranges[,4]))

如果您正在寻找任何范围之间的重叠,那么其他人(或IRanges :: foverlap())提到的findOveralaps()功能将是合适的,但您和#39;重新寻找&#39; parallel&#39; (行内?)重叠。

这里解决方案的逻辑与@Julius的答案相同,但是它是矢量化的&#39; (例如,1次调用pmin(),而不是nrow(ranges)调用sort()),并且对于可能范围的较长向量,应该更快(尽管使用更多内存)。

答案 1 :(得分:2)

一般来说:

apply(ranges,1,function(x){y<-c(sort(x[1:2]),sort(x[3:4]));max(y[c(1,3)])<=min(y[c(2,4)])})

或者,如果间隔不能仅在一个点重叠(例如因为它们是打开的):

!apply(ranges,1,function(x){y<-sort(x)[1:2];all(y==sort(x[1:2]))|all(y==sort(x[3:4]))})