【发布时间】:2021-03-22 21:54:15
【问题描述】:
我有一个按行给出的间隔数据帧,间隔从第一列开始,间隔在第二列结束。数字不是整数。如何找到所有间隔的重叠范围(如果有)。例如:
df <- cbind(c(1.5, 3, 2.1, 1), c(6, 5, 3.7, 10.1))
plot(1:11, ylim = c(0, 5), col = NA)
segments(x0 = c(1.5, 3, 2.1, 1), y0 = 1:4, x1 = c(6, 5, 3.7, 10.1), y1 = 1:4)
abline(v = 3, col = "red", lty = 2)
abline(v = 3.7, col = "red", lty = 2)
somefunc(df)
[1] 3 3.7
一个好的、快速的基础 R(或像 dplyr ect 这样的通用包)解决方案是首选。我已经知道foverlaps (data.table) 和 IRranges,但它们似乎没有解决我的问题。对于奖励积分,如果存在阻止完全重叠的间隔,例如:rbind'ing c(20, 25) 到 df 以上,则该函数仍应返回任何向量的最大可能重叠,即仍返回 c(3, 3.7)。
编辑:Henrik 链接的解决方案很好,但依赖于生成具有给定步骤的序列(例如seq(start, end by = 1)),然后减少它们以获得交集。我的间隔可能比这一步窄。理想情况下,我需要一个使用逻辑比较或类似方法进行操作的解决方案。链接页面中的第二个解决方案也不太正确(见下文)
EDIT EDIT:只有当它对所有范围都通用时,才应返回交集。 Henrik 链接的帖子中的解决方案 2 将区间组合在一起,即使组中并非所有区间都与其他区间相交
【问题讨论】: