2013-11-28 162 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