gpt4 book ai didi

r - 检查 R 中的两个区间是否重叠

转载 作者:行者123 更新时间:2023-12-04 12:51:41 24 4
gpt4 key购买 nike

给定四列(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

我尝试了一个 View ,但没有让它工作,特别是间隔没有“排序”的事情使得我的 R 技能很难找到解决方案。
我想找到列对的最小值和最大值(例如 FromUp、ToUp)然后比较它们?

任何帮助,将不胜感激。

最佳答案

对它们进行排序

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() )并且应该更快(尽管使用更多内存)用于可能范围的更长向量。

关于r - 检查 R 中的两个区间是否重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35524054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com