2017-02-02 3 views
1

私は2つのテーブルを持っています。これらは両方とも染色体の形であり、この染色体の開始座標と終了座標の両方にあります。第1の表は遺伝子を含み、第2の表はこれらの遺伝子に含まれてもしなくてもよい短い配列を含む。私の実際のデータセットでは、遺伝子は約50,000行であり、配列は約7.000.000行であり、両方のテーブルにはさまざまな余分な列があります。私は2つのテーブルの重複を見つけたいと思います。テーブルの交差効率の向上

chromosome=as.character(rep(c(1,2,3,4,5), each=10000)) 
start=floor(runif(50000, min=0, max=50000000)) 
end=start+floor(runif(10000, min=0, max=10000)) 
genes=cbind(chromosome, start, end) 

startseq=floor(runif(7000000, min=0, max=50000000)) 
endseq=startseq+4 
sequences=cbind(chromosome, startseq, endseq) 

私が使用しているすべての交差を見つけようとしています:

for (g in 1:nrow(sequences)) { 
    seqrow=as.vector(sequences[g,]) 
    rownr=which(genes[,1]==seqrow[1] & genes[,2] < seqrow[2] & genes[,3] > seqrow[3]) 
    print(rownr) 
} 

私は私が私の本当のデータセットを持っている余分な列に対してアクションを実行するには、これらの行番号を使用する予定です。現在の問題は、記述されたプロセスがかなり遅いことです。どのようにしてこの交差をスピードアップできますか?

+0

@ emilliman5コードのように見えますが、私はまだ1つのことをコメントしたいと思います。これらのテーブル、 'genes'と' sequences'を作成するときは、 'cbind'関数を使います。そして、すべての入力が原子ベクトルであり、そのうちの1つが文字ベクトル( '染色体')であるので、文字行列を作成します。タイプ「頭(染色体)」 - すべての数字は実際に文字列になりました。後で数字を比較したいときは、それは適切ではないと思います。そのような場合には、 'data.frame(sequences、start、end)'の代わりに 'data.frame'をここで' matrix'の代わりに作成する必要があります。 –

+0

あなたはそれを言及していただきありがとうございます。 – Xizam

答えて

1

このタスクにはbioconductor、特にGenomicRangesパッケージを使用します。オーバーラップのインデックスを含むクラス "ヒット"のオブジェクトを返します。 intersect関数を使うこともできますが、これは交差するseqのidではなく交差の間隔を返します。短いバイオコンダクタとGenomicRangesには、非常に高速な多くの便利なセット機能があります。

## try http:// if https:// URLs are not supported 
source("https://bioconductor.org/biocLite.R") 
biocLite() 
biocLite("GenomicRanges") ## I think genomicranges is part of the standard bioconductor install but if not this will install it. 


library(GenomicRanges) 

set.seed(8675309) 
chromosome <- as.character(rep(c(1,2,3,4,5), each=10000)) 
start <- floor(runif(50000, min=0, max=50000000)) 
end <- start+floor(runif(10000, min=0, max=10000)) 
genes <- cbind(chromosome, start, end) 

startseq <- floor(runif(7000000, min=0, max=50000000)) 
endseq <- startseq+4 
chromosome <- sample(c(1,2,3,4,5), size = 7000000, replace=T) 
sequences=cbind(chromosome, startseq, endseq) 

genes <- GRanges(seqnames = chromosome, ranges = IRanges(start = start, end = end)) 
seqs <- GRanges(seqnames = chromosome, ranges = IRanges(start = startseq, end = endseq)) 

x <- findOverlaps(seqs, genes) 
head(x) 

#Hits object with 6 hits and 0 metadata columns: 
#  queryHits subjectHits 
#  <integer> <integer> 
# [1]   2  41673 
# [2]   2  47476 
# [3]   3  20048 
# [4]   4  9624 
# [5]   4  5662 
# [6]   4  1531 
# ------- 
# queryLength: 7000000 
# subjectLength: 50000 
+0

今日は調査する時間がなくなりましたが、有望です。明日それを見るだろう。ありがとう! – Xizam

+0

これは完璧で非常に速く動作します。もう1つの質問ですが、通常はサブセット化可能なマトリックスとして出力するだけですが、これを繰り返し処理できますか? – Xizam

+0

心配しないで、私はas.matrix(x)が動作することを発見しました! – Xizam

関連する問題