Rで単純なゲノムトラック交差を実行しようとしていますが、おそらくforループの使用に関連する主要なパフォーマンスの問題が発生しています。
この状況では、100bpの間隔で事前定義されたウィンドウがあり、各ウィンドウのどれだけがmylistの注釈でカバーされているかを計算しようとしています。グラフィック的には、次のようになります。
0 100 200 300 400 500 600
windows: |-----|-----|-----|-----|-----|-----|
mylist: |-| |-----------|
だから私はそれを行うためにいくつかのコードを書きましたが、それはかなり遅く、私のコードのボトルネックになっています:
##window for each 100-bp segment
windows <- numeric(6)
##second track
mylist = vector("list")
mylist[[1]] = c(1,20)
mylist[[2]] = c(120,320)
##do the intersection
for(i in 1:length(mylist)){
st <- floor(mylist[[i]][1]/100)+1
sp <- floor(mylist[[i]][2]/100)+1
for(j in st:sp){
b <- max((j-1)*100, mylist[[i]][1])
e <- min(j*100, mylist[[i]][2])
windows[j] <- windows[j] + e - b + 1
}
}
print(windows)
[1] 20 81 101 21 0 0
当然、これは、ここで提供する例よりもはるかに大きいデータセットで使用されています。いくつかのプロファイリングを通じて、ボトルネックがforループにあることがわかりますが、* apply関数を使用してそれをベクトル化しようとすると、コードの実行速度が1桁遅くなります。
私はCで何かを書くことができると思いますが、可能であればそれを避けたいと思います。誰かがこの計算をスピードアップする別のアプローチを提案できますか?