2013-11-28 53 views
4

我想知道什么是定义所有范围的最佳方法,这些范围不在给定的一组范围内。举例来说,如果我有已知坐标一组基因:查找定义的一组范围之外的所有范围

dtGenes <- fread(
    "id,start,end 
1,1000,1300 
2,1200,1500 
3,1600,2600 
4,3000,4000 
") 

比方说,我知道,染色体的总长度(为简单起见,假设它们都是同一个染色体上)是10000。所以,最后我期望有间隔区下面的列表:

"startR,endR 
    0,1000 
1500,1600 
2600,3000 
4000,10000 
" 

可以Bioconductor的的IRange有用吗?或者还有其他一些好方法来解决这个问题?

回答

4

使用Bioconductor的包GenomicRanges,改变你的原始数据到GRanges

library(GenomicRanges) 
gr <- with(dtGenes, GRanges("chr1", IRanges(start, end, names=id), 
          seqlengths=c(chr1=10000))) 

然后你的基因

gaps <- gaps(gr) 

GRanges之间知道链发现的空白。您没有在GRanges构造函数中指定一条线,因此线被分配为*。因此有“缺口”的+, - 和*股,而你只能在那些对*链

> gaps[strand(gaps) == "*"] 
GRanges with 4 ranges and 0 metadata columns: 
     seqnames  ranges strand 
     <Rle>  <IRanges> <Rle> 
    [1]  chr1 [ 1, 999]  * 
    [2]  chr1 [1501, 1599]  * 
    [3]  chr1 [2601, 2999]  * 
    [4]  chr1 [4001, 10000]  * 
    --- 
    seqlengths: 
    chr1 
    10000 

注意Bioconductor的惯例,染色体从1开始感兴趣了,该范围已关闭 - 范围内包含startend坐标。在gr上使用shiftnarrow使您的范围与Bioconductor约定一致。格兰杰在数百万个范围内的运营效率很高。

+0

完美的解决方案,非常感谢! –

1

可以使用reduceIRanges

减少第一订单范围以x从左至右,然后合并 重叠或相邻的。

library(IRanges) 
dat <- read.csv(text="id,start,end 
1,1000,1300 
2,1200,1500 
3,1600,2600 
4,3000,4000 
") 

ir <- IRanges(dat$start,dat$end) 
rir <- reduce(ir) 
IRanges of length 3 
    start end width 
[1] 1000 1500 501 
[2] 1600 2600 1001 
[3] 3000 4000 1001 
+0

感谢您指点! “减少”并不能完全解决寻找外部区域的任务,但它确实是重要的第一步;在其他一些情况下,这对我来说肯定是有用的,但是对于这个给定的任务,我非常喜欢带有'间隙'的解决方案,它通过单个操作完成所有工作。 –

+0

@VasilyA我不使用很多iranges软件包。所以马丁摩根解决方案当然是要走的路! – agstudy