2017-01-14 4 views
2

fastaファイル(〜4Gb)で読み込み、長さ4bpsのウィンドウでヌクレオチド頻度を計算するにはどうすればよいですか?fastaファイルを効率よく読み込んでヌクレオチド頻度を計算するR

それは私がそれを使用してインデックスにしようとしている(そして、そこの多くの)

library(ShortRead) 
readFasta('myfile.fa') 

を使用してFASTAファイルを読み込むために時間がかかりすぎる

library(Rsamtools) 
indexFa('myfile.fa') 
fa = FaFile('myfile.fa') 

しかし、私は方法がわかりませんこの形式でファイルにアクセスする

+0

比較的容易そこでからreadLines()と処理を経由してチャンク:あなたは周波数を計算している場合はhttp://amunategui.github.io/dealing-with-large-files/理由はありませんRAM全体を一度に保持しようとする。あなたはチャンクでデータを読むのに役立つ複数のパッケージがあるようです。例えば。 https://cran.r-project.org/web/packages/chunked/chunked.pdf –

+0

bioconductorパッケージである 'Biostrings'をお勧めします。これは非常に高速であり、 'Biostrings :: oligonucleotideFrequency'のような異なる長さと組み合わせのヌクレオチドフリークエンシーを扱う一連の機能を持っています。 – mt1022

+0

私は 'Biostrings'の機能に慣れていますが、実際に使用するためにfastaファイルをRに読み込む方法はわかりません – user3067923

答えて

2

私は「遅い」はサイズが微細になり、ファイルを読み込むことよね。それよりも長く、ソフトウェア以外のものが問題です。ファイルがどこにあるのか、オペレーティングシステム、処理する前にファイルを操作したかどうか(たとえば、テキストエディタでファイルを開くなど)を尋ねるのが適切なのかもしれません。

メモリが不足しているために「速度が遅すぎる」場合は、チャンクを読み込むと役立ちます。 Rsamtools

fa = "my.fasta" 
## indexFa(fa) if the index does not already exist 
idx = scanFaIndex(fa) 

と、Nに、例えば、インデックスのチャンクを作成= 10のチャンク

chunks = snow::splitIndices(length(idx), 10) 

し、ファイル

res = lapply(chunks, function(chunk, fa, idx) { 
    dna = scanFa(fa, idx[chunk]) 
    ## ... 
}, fa, idx) 

使用do.call(c, res)又は最終結果を連結と同様の処理単一の値を累積している場合はforループを使用してください。 fastaファイルを索引付けするには、samtoolsライブラリーを呼び出します。コマンドラインでsamtoolsを使用することも、Windows以外の場合のオプションです。

代替は、次に(偶数で、Rの内のレコードを読み出し、各レコードは、DNA配列の単一の行から構成されている場合、その

idx = fasta.index(fa, seqtype="DNA") 
chunks = snow::splitIndices(nrow(fai), 10) 
res = lapply(chunks, function(chunk) { 
    dna = readDNAStringSet(idx[chunk, ]) 
    ## ... 
}, idx) 

とを介してチャンク次いで、インデックスにファイルをBiostrings::fasta.index()を使用することです-numbered)これは役立つかもしれない

con = file(fa) 
open(fa) 
chunkSize = 10000000 
while (TRUE) { 
    lines = readLines(fa, chunkSize) 
    if (length(lines) == 0) 
     break 
    dna = DNAStringSet(lines[c(FALSE, TRUE)]) 
    ## ... 
} 
close(fa) 
+0

' scanFaIndex'を1時間以上実行していますが、コマンドが終了していません。 fastaファイルの読み込み速度を上げるための代替ソリューションはありますか? – user3067923

+0

'sessionInfo()'の出力とfastaファイルの内容(多くの小さなシーケンスやいくつかの大きな?)を詳細に更新してください。私は2番目のアプローチで私の答えを更新しますが、私はそれが遅いと思っていただろう... –

0

Biostringsをロードし、readDNAStringSet()の方法を使用して

わずかに変更さ example("readDNAStringSet")から

、:

library(Biostrings) 
# example("readDNAStringSet") #optional 
filepath1 <- system.file("extdata", "someORF.fa", package="Biostrings") 
head(fasta.seqlengths(filepath1, seqtype="DNA")) # 
x1 <- readDNAStringSet(filepath1) 
head(x1) 
関連する問題