【问题标题】:find indices of overlapping ranges in R在 R 中查找重叠范围的索引
【发布时间】:2015-02-09 03:16:39
【问题描述】:

我的框架是这样的

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

其中第一个列是度量的开始,另一个列是度量的结束。我现在想返回与特定行部分重叠的那些行的索引。示例将是第 1 行。索引将是 2,4,6 - 因为这些部分重叠。我需要非常频繁地进行这种比较,所以一个有效的解决方案会很棒

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

【问题讨论】:

  • 该函数应该只找到与给定行部分重叠的那些行的索引(在问题 1 中)。我想这可以通过一系列更大的平等比较来完成,但这不是很优雅
  • 是否可以合并行的索引作为比较(在这个例子中是第一行),但想象一下它是第 3 行
  • 你想让第 1 行也出现在输出中吗?

标签: r indexing


【解决方案1】:

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

【讨论】:

  • 使用访问器函数subjectHits(overls)queryHits(overls) 比直接槽访问要好得多(也是完整的 TRUE 和 FALSE,因为可以分配 T,T = FALSE,而 TRUE 不能)。
【解决方案2】:

这是使用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参数中选择您想要的重叠类型

foverlaps(df[-indx], temp, which=TRUE, 
          type="any", nomatch=0L)$xid + 1 
## [1] 2 4 6

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多