2016-12-26 1 views
-1

Kann das Ergebnis einer Schleife in einem Vektor gespeichert werden? Mein Ziel ist es, einen Vektor (oder eine Liste) mit den Daten (des Vektors "Geschenke") zu haben, die kleiner als ein bestimmtes Datum sind (date_3 im Code).Wie speichert man die Ergebnisse einer Schleife (mit if-Anweisung) in R?

for (i in 1:21) { 
if ((!is.na(gifts[i])) & (gifts[i] < Date_3)) { 
    print(gifts[i]) 
} 
} 

"Geschenke" stellt einen Vektor dar, der eine Anzahl von Daten enthält. Date_3 ist ein bestimmtes Datum

Kann jemand helfen? Dank

+2

Sie benötigen keine for-Schleife. 'na.omit (Geschenke [Geschenke_Datum_3])' sollte ausreichen. oder 'Geschenke [die (Geschenke Psidom

+0

Danke, das funktioniert perfekt! ;) – ClS

Antwort

1

Eine for-Schleife ist eine äußerst ineffiziente Möglichkeit, dies zu tun. Wie durch Psidom auf den Kommentaren darauf hingewiesen, können Sie erreichen, was Sie wollen mit:

na.omit(gifts[gifts < Date_3]) 

Ein einfacher Vergleich mit-Micro:

gifts = seq(as.Date("1910/1/1"), as.Date("1930/1/1"), "years") 
Date_3 = as.Date("1921-01-01") 

microbenchmark({ 
    a = vector() 
    for (i in gifts) { 
     if ((!is.na(gifts[i])) & (gifts[i] < Date_3)) { 
      a = c(a, gifts[i]) 
     } 
    } 
}) 

Ergebnisse in:

Unit: milliseconds 
    min  lq  mean median  uq  max  neval 
1.306957 1.329337 1.400435 1.350478 1.378751 2.45866 100 

Und mit was Psidom vorgeschlagen:

microbenchmark(
    na.omit(gifts[gifts < Date_3]) 
) 
Unit: microseconds 
min  lq  mean median  uq max  neval 
14.674 15.6745 16.99335 16.026 16.512 67.95 100 

Im Vergleich der Mittelwerte ist der zweite Ansatz etwa 82-mal schneller. Append an Vektoren innerhalb einer for-Schleife ist normalerweise eine schlechte Idee und Sie sollten immer sorgfältig überlegen, ob Sie es wirklich tun müssen.

0

Wenn ich will Ergebnisse speichern in einem Vektor dynamischer Länge tun, ich speichern Sie es in der Regel in den Vektor auf diese Weise:

results <- vector()  
for (i in 1:21) { 
    if ((!is.na(gifts[i])) & (gifts[i] < Date_3)) { 
     results[length(results)+1] <- gifts[i] 
    } 
} 

Beachten Sie, dass das ist, was ich durch dynamische Daten, wenn das Lesen benutzen würde, wie Durchforsten von Dateien nach bestimmten Daten, wobei ich den Vektor mit tmp Variablen füllen würde. Psidom ist richtig, dass der effizienteste Weg in diesem Fall na.omit(gifts[gifts < Date_3]) ist.

Verwandte Themen