2016-02-20 57 views
0

给定四列(FromUp,ToUp,FromDown,ToDown)中的值时,其中两个总是定义一个范围(FromUp,ToUp和FromDown,ToDown)。我如何测试两个范围是否重叠。指出范围值未被排序是很重要的,所以“From”值可以高于“To”值,反之亦然。检查两个区间是否重叠在R

一些示例数据:

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)并且比较它们?

任何帮助,将不胜感激。

+0

@akrun等人,可以请你展示如何'foverlaps()'可以用来解决这个问题吗?也许我错误地理解了这个问题。 –

+0

我也很难看到你在这种情况下如何使用'foverlaps'。由于'foverlaps'需要设置键,相应列的顺序会发生变化,而这个问题需要按行进行比较。 – Jaap

回答

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])) 

其他人所说的foverlap()功能(或IRanges :: findOveralaps())如果你正在寻找,这将是适当的对于之间的任何范围之间的重叠,但您正在寻找'平行'(行内?)重叠。

这里的解决方案的逻辑是一样的@Julius的答案,但“矢量”(例如,1次来电,pmin(),而不是nrow(ranges)调用sort()),应该是(虽然使用更多的内存要快得多)可能范围的较长向量。

+0

是的,这可能不够清楚我正在寻找行内的重叠。 看起来你的答案就是我正在寻找的,如果我明白代码正确采取最小和最大的方法。太好了谢谢! – Kitumijasi

2

一般情况下:(因为它们是开放EG)

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]))})