[英]find indices of overlapping ranges in R
我的框架看起来像这样
4 8
6 9
1 2
5 7
10 14
3 9
其中第一个颜色是小节的开始,另一个颜色是小节的结束。 现在,我想返回部分与特定行重叠的那些行的索引。 示例将在第1行。索引将为2,4,6-因为它们部分重叠。 我需要经常进行比较,因此有效的解决方案将是一个很好的选择
请注意,我不仅在寻找部分重叠,而且也在寻找完全重叠(3 9)..
这是使用data.table
包中的foverlaps()
函数的可能解决方案。
设置列名称并选择行索引:
library(data.table)
cols <- c("start", "end")
indx <- 1L
将您的数据转换为data.table
对象,设置列名,并将特定行与其余数据分开,然后对其进行键控(这是必不可少的步骤-检查?foverlaps
以获取更多信息)。
setnames(setDT(df), cols)
temp <- setkeyv(df[indx], cols)
运行foverlaps
功能。 您可以在type
参数中选择所需的重叠type
foverlaps(df[-indx], temp, which=TRUE,
type="any", nomatch=0L)$xid + 1
## [1] 2 4 6
您可以使用“ IRanges”包:
library(IRanges)
findOverlaps(IRanges(DF$V1, DF$V2), IRanges(DF$V1[1], DF$V2[1]))@queryHits
#[1] 1 2 4 6
或一次生成所有重叠,然后再生成子集:
overls = findOverlaps(IRanges(DF$V1, DF$V2), ignoreSelf = TRUE)
split(subjectHits(overls), queryHits(overls))
subjectHits(overls)[queryHits(overls) == 1]
#[1] 2 4 6
“ DF”:
DF = structure(list(V1 = c(4L, 6L, 1L, 5L, 10L, 3L), V2 = c(8L, 9L,
2L, 7L, 14L, 9L)), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA,
-6L))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.