Ich habe 2 Tabellen.Sie sind beide in der Form Chromosom, Anfang und Ende Koordinaten auf diesem Chromosom. Die erste Tabelle enthält Gene und die zweite Tabelle enthält kurze Sequenzen, die in diese Gene fallen können oder nicht. In meinem realen Datensatz sind Gene ungefähr 50.000 Zeilen und Sequenzen sind ungefähr 7.000.000 Zeilen und beide Tabellen haben verschiedene zusätzliche Spalten. Ich würde gerne Überschneidungen zwischen den beiden Tabellen finden.Erhöhung der Effizienz der Tabelle Schnittpunkt
chromosome=as.character(rep(c(1,2,3,4,5), each=10000))
start=floor(runif(50000, min=0, max=50000000))
end=start+floor(runif(10000, min=0, max=10000))
genes=cbind(chromosome, start, end)
startseq=floor(runif(7000000, min=0, max=50000000))
endseq=startseq+4
sequences=cbind(chromosome, startseq, endseq)
Ich versuche, alle intersects zu finden mit:
for (g in 1:nrow(sequences)) {
seqrow=as.vector(sequences[g,])
rownr=which(genes[,1]==seqrow[1] & genes[,2] < seqrow[2] & genes[,3] > seqrow[3])
print(rownr)
}
Ich beabsichtige, diese Zeilennummern zu verwenden, um Aktionen auf den zusätzlichen Spalten ich in meinem realen Datensatzes zu erfüllen haben. Das Problem im Moment ist, dass der beschriebene Prozess eher langsam ist. Auf welche Weise könnte ich diesen Schnitt beschleunigen?
Scheint wie @ emilliman5 Code löst Ihr Problem, aber ich möchte immer noch eine Sache kommentieren. Wenn Sie diese Tabellen erstellen, "Gene" und "Sequenzen", verwenden Sie die Funktion "cbind". Und da alle Eingaben atomare Vektoren sind und einer von ihnen ein Zeichenvektor ("Chromosom") ist, erzeugt er eine Zeichenmatrix. Geben Sie "Kopf (Chromosom)" ein - alle Zahlen wurden tatsächlich zu Zeichenketten - und ich denke, das ist nicht angemessen, wenn Sie Zahlen später vergleichen möchten. Was Sie in solchen Fällen brauchen, ist hier ein 'dat.frame' anstelle von' matrix': 'data.frame (sequenzen, start, end)'. –
Sie haben absolut recht, vielen Dank für Ihre Erwähnung. – Xizam