Mam dwa data.frames każdy z trzema kolumnami: chrom, start & stop, nazwijmy je zakresami A i zakresamiB. Dla każdego rzędu zakresów A szukam, który (jeśli którykolwiek) wiersz w zakresach B zawiera w całości rząd A rzędów - przez co rozumiem rangesAChrom == rangesBChrom, rangesAStart >= rangesBStart and rangesAStop <= rangesBStop
.Znalezienie nakładki w zakresach z R
W tej chwili robię następujące, które po prostu nie lubię bardzo. Zauważ, że zapętlałem się nad rzędami zakresów A z innych powodów, ale żaden z tych powodów nie jest prawdopodobnie wielkim problemem, po prostu sprawia, że rzeczy stają się bardziej czytelne, biorąc pod uwagę to konkretne rozwiązanie.
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
dla każdego wiersza w rangesA:
matches <- which((rangesB[,'chrom'] == rangesA[row,'chrom']) &&
(rangesB[,'start'] <= rangesA[row, 'start']) &&
(rangesB[,'stop'] >= rangesA[row, 'stop']))
I postać nie musi być lepsze (i lepiej, mam na myśli szybszy nad dużymi instancjami zakresów A i zakresów B) sposób, aby to zrobić, niż zapętlenie tego konstruktu. Jakieś pomysły?
Dobra wskazówka na IRanges, zapomniałem o tym. Nie skończyłem na tym, ponieważ nie pasowało to do mojej sytuacji z różnych powodów, ale nadal dobrze wiedzieć. Mój zabawkowy przykład pomijał kilka kluczowych bitów (moja własna wina), które utrudniały mi pracę z IRLingiem, a rozwiązanie merge() zapewniało ogromne przyspieszenie. Ponadto, podczas gdy skaluje się masowo, widzimy także wiele bardzo małych przypadków i zakładam, że obciążenie S4 spowolniło w tych przypadkach. – geoffjentry
czy istnieje również możliwość policzenia również częściowo zachodzenia na siebie? – Cina