2015-05-28 10 views
7

Angenommen, ich brauche brauchen, um aus irgendeinem Grund die Zeilen in einem Datenrahmen zu durchlaufen.Schleifen über Zeilen in einem Datenframe

ich eine einfache data.frame

df <- data.frame(id = sample(1e6, 1e7, replace = TRUE)) 

Es scheint, dass f2 viel langsamer als f1 ist, während ich sie äquivalent zu erwarten.

f1 <- function(v){ 
     for (obs in 1:(1e6)){ 
      a <- v[obs] 
     } 
     a 
    } 
system.time(f1(df$id)) 

f2 <- function(){ 
     for (obs in 1:(1e6)){ 
      a <- df$id[obs] 
     } 
    a 
    } 
system.time(f2()) 

Würdest du wissen warum? Verwenden sie genau die gleiche Menge an Speicher?

+3

Mit der ersten Funktion, die Sie '$' einmal verwenden, in der zweiten Funktion Du benutzt es 1e6 mal. '$' ist nicht die schnellste Teilmengenfunktion. – Roland

+0

Was mich verblüfft ist, dass 'f1' doppelt so schnell ist wie' f3 <- function (v) für (a in v) {NULL}; system.time (f3 (df $ id)) '. Oh, ich sehe: '1e6' ist nicht die volle Länge des Vektors. 'system.time (f3 (df $ id [1: 1e6]))' ist schnell. – Frank

Antwort

6

Wenn Sie stattdessen Ihre Timings so schreiben und erkennt, dass df$x wirklich einen Funktionsaufruf (bis `$`(df,x)) das Geheimnis verschwindet:

system.time(for(i in 1:1e6) df$x) 
# user system elapsed 
# 8.52 0.00 8.53 
system.time(for(i in 1) df$x) 
# user system elapsed 
#  0  0  0 
2

In f1 umgehen Sie den Datenrahmen vollständig, indem Sie einfach einen Vektor an Ihre Funktion übergeben. Also dein Code ist im Wesentlichen "Ich habe einen Vektor! Dies ist das erste Element. Dies ist das zweite Element. Dies ist das dritte ..."

Im Gegensatz dazu geben Sie in f2, geben Sie einen ganzen Datenrahmen und dann Holen Sie jedes Element einer einzelnen Spalte jedes Mal. So ist Ihr Code "Ich habe einen Datenrahmen. Dies ist das erste Element der ID-Spalte. Dies ist das zweite Element der ID-Spalte. Dies ist die dritte ..."

Es ist viel schneller, wenn Sie die extrahieren einfache Datenstruktur (Vektor) einmal, und kann dann nur damit arbeiten, anstatt wiederholt die einfache Struktur aus dem größeren Objekt zu extrahieren.

Verwandte Themen