Ich versuche eine einfache genomische Track-Schnittmenge in R zu erstellen, und stürze mich in große Performance-Probleme, die wahrscheinlich mit der Verwendung von for-Schleifen zusammenhängen.R Optimierung: Wie kann ich eine For-Schleife in dieser Situation vermeiden?
In dieser Situation habe ich vordefinierte Fenster in Abständen von 100 bp und ich versuche zu berechnen, wie viel von jedem Fenster durch die Anmerkungen in Mylist abgedeckt ist. Grafisch sieht es etwa so aus:
0 100 200 300 400 500 600
windows: |-----|-----|-----|-----|-----|-----|
mylist: |-| |-----------|
Also habe ich einige Code schrieb nur das zu tun, aber es ist ziemlich langsam und hat sich zu einem Engpass in meinem Code geworden:
##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
Dies ist natürlich zu sein verwendet auf Datensätzen, die viel größer sind als das Beispiel, das ich hier zur Verfügung stelle. Durch ein Profiling kann ich sehen, dass der Engpass in den for-Schleifen liegt, aber mein ungeschickter Versuch, ihn mit * apply-Funktionen zu vektorisieren, führte zu einem Code, der eine Größenordnung langsamer verläuft.
Ich nehme an, ich könnte etwas in C schreiben, aber das möchte ich wenn möglich vermeiden. Kann jemand einen anderen Ansatz vorschlagen, der diese Berechnung beschleunigt?
Es scheint ein Problem zu sein, das durch das 'IRanges'-Paket in Bioconductor behoben werden kann. Das kann ein guter Ausgangspunkt sein. – andrewj
hrmm - danke für den Zeiger - scheint vielversprechend. – chrisamiller