Ich habe zwei data.frames mit jeweils drei Spalten: chrom, start & Stop, nennen wir sie RangesA und RangesB. Ich suche für jede Zeile von RangesA, welche (wenn überhaupt) Zeile in RangesB vollständig die RangesA Zeile enthält - womit ich meine rangesAChrom == rangesBChrom, rangesAStart >= rangesBStart and rangesAStop <= rangesBStop
.Suche nach Überlappungen in Bereichen mit R
Im Moment mache ich folgendes, was ich einfach nicht sehr mag. Beachten Sie, dass ich aus anderen Gründen über die Reihen von RangesA hinauslaufe, aber keiner dieser Gründe wird wahrscheinlich eine große Sache sein, es bringt nur dazu, dass die Dinge angesichts dieser speziellen Lösung lesbarer werden.
rangesA:
chrom start stop
5 100 105
1 200 250
9 275 300
rangesB:
chrom start stop
1 200 265
5 99 106
9 275 290
für jede Zeile in rangesA:
matches <- which((rangesB[,'chrom'] == rangesA[row,'chrom']) &&
(rangesB[,'start'] <= rangesA[row, 'start']) &&
(rangesB[,'stop'] >= rangesA[row, 'stop']))
ich dort Figur muss einen besseren (und besser sein, ich meine, schneller über große Instanzen von RangesA und RangesB), dies zu tun, als über dieses Konstrukt zu schleifen. Irgendwelche Ideen?
Gut Zeiger auf IRanges, vergaß darüber. Ich ging damit nicht weiter, da es aus vielerlei Gründen nicht zu meiner eigenen Situation passte, aber immer noch gut zu wissen. Mein Spielzeugbeispiel hat ein paar Schlüsselbits (meine eigene Schuld) weggelassen, die das Arbeiten mit IRanges schwierig für mich machten, und die merge() Lösung lieferte eine massive Beschleunigung, wie es war. Während es massiv skaliert, sehen wir auch viele sehr kleine Fälle und was ich vermute, war, dass der Overhead des S4 es in diesen Fällen verlangsamte. – geoffjentry
gibt es eh auch teilüberlappungen zu zählen? – Cina