找到R中重叠范围的索引

时间:2015-02-08 10:28:25

标签: r indexing

我的框架看起来像这样

4 8
6 9
1 2
5 7
10 14
3 9

其中第一个col是开始而另一个col是度量的结束。我现在想要返回那些部分重叠特定行的行的索引。示例将排1.指数将是2,4,6 - 因为这些部分重叠。我需要经常进行这种比较,这样一个有效的解决方案就会很棒

请注意,我不仅要查看部分重叠,还要完全重叠(3 9)..

2 个答案:

答案 0 :(得分:2)

这是使用foverlaps()包中的data.table函数的可能解决方案。

设置列名并选择行索引:

library(data.table)
cols <- c("start", "end")
indx <- 1L

将您的数据转换为data.table对象,设置列名并将特定行与其余数据分开并键入(这是必不可少的步骤 - 请查看?foverlaps以获取更多信息)。

setnames(setDT(df), cols)
temp <- setkeyv(df[indx], cols)

运行foverlaps功能。您可以在type参数

中选择所需的重叠类型
foverlaps(df[-indx], temp, which=TRUE, 
          type="any", nomatch=0L)$xid + 1 
## [1] 2 4 6

答案 1 :(得分:2)

您可以使用“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))