给定四列(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)而不是比较它们?
任何帮助都将不胜感激。
答案 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]))})