Ho due data.frames ciascuno con tre colonne: chrom, start & stop, chiamiamoli intervalliA e intervalliB. Per ogni riga di intervalli A, sto cercando di trovare quale (se presente) riga in intervalliB contiene completamente gli intervalliUna riga - con cui intendo rangesAChrom == rangesBChrom, rangesAStart >= rangesBStart and rangesAStop <= rangesBStop
.Trovare sovrapposizione in intervalli con R
In questo momento sto facendo quanto segue, che proprio non mi piace molto. Tieni presente che eseguo il looping delle righe di intervalliA per altri motivi, ma nessuno di questi motivi è probabile che sia un grosso problema, ma finisce per rendere le cose più leggibili data questa particolare soluzione.
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
per ogni riga rangesA:
matches <- which((rangesB[,'chrom'] == rangesA[row,'chrom']) &&
(rangesB[,'start'] <= rangesA[row, 'start']) &&
(rangesB[,'stop'] >= rangesA[row, 'stop']))
immagino ci deve essere una migliore (e meglio, intendo più veloce su grandi istanze di intervalliA e intervalliB) modo per fare questo rispetto al ciclo su questo costrutto. Qualche idea?
Buono puntatore sullo IRanges, dimenticato. Non sono andato a finire con questo dato che non si adattava alla mia situazione per una serie di motivi, ma comunque buono da sapere. Il mio esempio di giocattolo ha lasciato fuori un paio di bit chiave (la mia colpa) che ha reso il lavoro con IRanges difficile da capire per me, e la soluzione di unione() ha fornito un enorme aumento di velocità. Inoltre, mentre scala in modo massiccio, vediamo anche molti casi molto piccoli e quello che sto assumendo era il sovraccarico dell'S4 che stava rallentando in quei casi. – geoffjentry
c'è comunque da contare anche sovrapposizioni parziali? – Cina