Ich versuche eine Schleife in r zu optimieren, die die Anzahl der Zeichenfolgenübereinstimmungen jedes Elements in einem Vektor in Bezug auf jede Zeile in einem Datenrahmen zählt. In kleinen Datensätzen funktioniert es ziemlich gut (~ 15 min; 11 Spalten, 914 Zeilen). Es dauert jedoch Tage, um in riesigen Datensätzen (914 Spalten, 18.000 Zeilen) zu laufen. Hier ist meine sehr einfach Schleife:Schneller r-loop string match (Vektor vs. dat.frame)
for (j in 1: dim(pddbnh)[1]){
for (i in 1:dim(pidf)[1]){
richa[i,j] <- length(pidf[i,][pidf[i,] == row.names(pddbnh)[j] ])
}
}
Ich frage mich, ob jemand weiß, wie man diese Schleife mit anderem Ansatz zu optimieren (z Vektorisierung). Jede Lösung würde sehr geschätzt werden!
UPDATE Hier ist ein kleiner Datensatz. Das ist die schnellste
df<-data.frame(replicate(10,sample(c("sp1", "sp2"),10,rep=TRUE)))
vec<-c("sp1", "sp2")
richa <- data.frame()
for (j in 1:length(vec)){
for (i in 1:dim(df)[1]){
richa[i,j] <- length(df[i,][df[i,] == vec[j] ])
}
}
Ja, ich weiß wahrscheinlich, wie das geht. Bitte geben Sie ein minimales reproduzierbares Beispiel zum Testen an. – Roland
Danke! Hier sind die zwei Dateien: https://www.dropbox.com/s/vvksp7c1kerqjbq/pddbnh.csv?dl=0 https://www.dropbox.com/s/zjt9shku0gjf03t/pidf.csv?dl=0 – CristianR
(Offensichtlich haben Sie noch keine gründliche Suche nach SO gemacht, da es viele Q & A's gibt, um die Performance von for-Schleifen zu verbessern.) Nach '[' to process '[pidf [i,] == row.names (pddbnh) [ j]] würde zum Scheitern verurteilt scheinen. Das Ergebnis dieses Arguments wird entweder 0 oder 1 nach der Nötigung sein (daher sollten Fehler bezüglich der Ersetzung mit der Länge Null auftreten). Vielleicht solltest du erklären, was du eigentlich versuchst. –