删除列表元素之间的交集

时间:2018-06-28 08:20:48

标签: r intervals

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

plot(t$sigma[1:200],type='l',log='y')

为了方便查看,我绘制了它们,从d1,黑色d2和红色d3开始有黑色间隔。这个想法是删除相交区域,例如d1中的间隔1和d2中的间隔1以及d3中的间隔1相交。我希望结果是

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中的其他间隔重叠。比较应同时进行,这意味着从一个数据帧的所有间隔中查找与来自其他数据帧的其他间隔重叠的区域,并同时将其删除。 我将不胜感激任何想法或建议

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

intervals

1 个答案:

答案 0 :(得分:1)

如果要查找在任何区域之间不重叠的区域,则可以计算覆盖率并提取覆盖率恰好为1的所有间隔。

 select distinct  FIPBNR, FILAR1, filev1,fiben1,fiart,fiben2,fiurk,
 count(*)


 from TRUFPR424/TRAFI00 
 where fifili <> 0 and filev1 = '6253744' and fiurk != 'U'

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

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]

下面的旧答案

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

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

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