【问题标题】:remove intersection between list elements删除列表元素之间的交集
【发布时间】:2018-06-28 21:57:48
【问题描述】:

如果我有包含 3 个或更多数据框的列表。每个都有间隔,然后我想找出这些间隔之间是否有交集。如果它们相交,我们需要删除相交。例如

d1<-cbind(st=c(1,4,6),ed=c(7,8,10)); d2<-cbind(st=c(4,8,17),ed=c(7,12,20)); d3<-cbind(st=c(1,8,25),ed=c(3,13,30))

l<-list(d1,d2,d3); l

为了便于可视化,我绘制了它们,黑色间隔来自 d1,蓝色 d2 和红色 d3。这个想法是删除相交区域,例如 d1 中的间隔 1 和 d2 中的 1 和 d3 中的 1 相交。我希望结果是

d2; st ed

    17 20

 d3; st ed
     13 13
     25 30

d1 将被删除,因为它的间隔与 d2 和 d3 中的其他间隔重叠。比较应该同时进行,这意味着从一个数据帧中的所有区间中找到与其他数据帧中的其他区间重叠的区域并同时删除它们。 我将不胜感激任何想法或建议

编辑:我想分离区间找到不与任何其他区间重叠的新区间(感谢西蒙帮助澄清这一点)但重要的是在将区间分离为一些重叠之前检查所有可能的交叉点如果之前没有比较间隔,则可能会消失。分离前的原始区间图

【问题讨论】:

  • 我无法弄清楚你的情节中的间隔将如何产生你的预期输出。您能否更详细地解释您想要达到的结果。您想找出不与任何其他区间重叠的区间吗?
  • 没错,我想分离区间找到不与任何其他区间重叠的新区间。原始区间的图只是为了显示预期结果是如何产生的。
  • 为什么不显示创建情节的代码?

标签: r intervals


【解决方案1】:

如果您想找到任何区域之间不重叠的区域,您可以计算覆盖率并提取覆盖率正好为 1 的所有区间。

library(IRanges)

l <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
group start end
d1 1  7
d1 4  8
d1 6 10
d2 4  7
d2 8 12
d2 15 20
d3  1  3
d3  8 13
d3 25 30
")

ranges <- IRanges(start=l$start, end=l$end)
slice(coverage(ranges), lower=1, upper=1)
#> Views on a 30-length Rle subject
#> 
#> views:
#>     start end width
#> [1]    13  13     1 [1]
#> [2]    15  20     6 [1 1 1 1 1 1]
#> [3]    25  30     6 [1 1 1 1 1 1]

如果您只想检查不属于同一组的区间的重叠,则可以针对每个组,从组中的区间中减去不属于该组的区间。

lapply(unique(l$group), function(g) {
  r1 <- IRanges(start=l$start[l$group==g], end=l$end[l$group==g])
  r2 <- IRanges(start=l$start[l$group!=g], end=l$end[l$group!=g])
  as.data.frame(setdiff(r1, r2))
})
#> [[1]]
#> [1] start end   width
#> <0 rows> (or 0-length row.names)
#> 
#> [[2]]
#>   start end width
#> 1    15  20     6
#> 
#> [[3]]
#>   start end width
#> 1    13  13     1
#> 2    25  30     6

下面的旧答案

您可以使用 Bioconductor 中的 IRanges 包将间隔集减少为仅不重叠的间隔。

l <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
group start end
d1 1  7
d1 4  8
d1 6 10
d2 4  7
d2 8 12
d2 15 20
d3  1  3
d3  8 13
d3 25 30
")

ranges <- IRanges(start=l$start, end=l$end, names=l$group)
reduced <- as.data.frame(reduce(ranges))
#>   start end width
#> 1     1  13    13
#> 2    15  20     6
#> 3    25  30     6

我不确定如何将组名保留在缩减的结果中。可以改用GenomicRanges,因为它们也可以包含元数据。

【讨论】:

  • 谢谢西蒙,但这无济于事,因为第一个间隔 (1,13) 是太多区域的联合,这些间隔应该分开而不是找到联合..
  • 啊,你是对的。我刚刚更新了我的答案。这更接近你想要的吗?
  • 太好了.. 谢谢,但是更新代码中的名称(组)怎么样?我怎样才能让他们回来?这很重要
猜你喜欢
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多