2016-09-30 4 views
1

Ich habe ein wenig über die zunehmende Leistung von for-Schleifen in r gelesen, aber ich bin immer noch mit einem fest ~ 140sec.Leistungssteigerung von R for-Schleifen nach Vorbelegung von Datenstrukturen

werde ich mit dem Code starten:

matrix <- matrix(NA, length(register[,1]), length(AK), dimnames = list(register[,1], AK)) 

data.cleaned <- data[data$FO %in% register[,1],] 
rownames(data.cleaned) <- paste(1:nrow(data.cleaned)) 


for (i in 1 : nrow(data.cleaned)) { 
    for (j in 1 : nrow(matrix)) { 

    if (data.cleaned$FO[i] == rownames(matrix)[j]) { 
     for (k in 1 : ncol(matrix)) { 

       if (data.cleaned$AK[i] == colnames(matrix)[k]) 
        {matrix[j,k] <- 1} 

     } 
    } 
    } 
} 

Leider kann ich kein reproduzierbares Beispiel liefern. Dieser data.cleaned Datenrahmen ist ein Rahmen, der ungefähr 11000 Reihen enthält. In jeder Zeile gibt es eine Beobachtung für FO (Hauptkategorie) und für AK (Unterkategorie für FO) (zwei verschiedene Variablen).

Das Ziel ist Füllmatrix [i, j] mit 1, wenn in einer Zeile die entsprechende FO- und AK-Beobachtung vorhanden ist.

Macht das Sinn. Bitte beachten Sie auch einen Kommentar, wenn ich angeben müssen oder kann die Post in einem klareren/besseren Weg

+1

Für Schleifen selbst sind nicht sehr performant in R Versuchen Sie, so viele von ihnen durch vektorisierte Funktionen zu ersetzen. – snaut

+0

Wie viele Sekunden braucht der Code aus meiner Antwort für Ihre Daten? – jogo

Antwort

2

Ersten Schritt schreiben:
Sie

cnames.m <- colnames(matrix) 

einstellen können, bevor Sie in die Schlaufen zu gehen. Am richtigen Ort können Sie

if (data.cleaned$AK[i] == cnames.m[k]) matrix[j,k] <- 1 

Zweiten Schritt zu tun:
Die innere Schleife ist identisch mit

matrix[j, data.cleaned$AK[i] == cnames.m] <- 1 

So gibt Schleife keine Notwendigkeit, mit k ist.

matrix <- matrix(NA, length(register[,1]), length(AK), dimnames = list(register[,1], AK)) 

data.cleaned <- data[data$FO %in% register[,1],] 
rownames(data.cleaned) <- paste(1:nrow(data.cleaned)) 

cnames.m <- colnames(matrix) 
for (i in 1 : nrow(data.cleaned)) for (j in 1 : nrow(matrix)) 
    if (data.cleaned$FO[i] == rownames(matrix)[j]) matrix[j, data.cleaned$AK[i] == cnames.m] <- 1 

eine Bemerkung über Objektnamen:
es keine gute Idee ist matrix eine Matrix zu nennen (würde man einen Hund nennen Dog?)

Verwandte Themen