performance - one - rbindlist




Leistung von rbind.data.frame (4)

Das ist ~ 25% schneller, aber es muss einen besseren Weg geben ...

system.time({
  N <- do.call(sum, lapply(someParts, nrow))
  SP <- as.data.frame(lapply(someParts[[1]], function(x) rep(x,N)))
  k <- 0
  for(i in 1:length(someParts)) {
    j <- k+1
    k <- k + nrow(someParts[[i]])
    SP[j:k,] <- someParts[[i]]
  }
})

Ich habe eine Liste von Datenrahmen, für die ich sicher bin, dass sie alle mindestens eine Zeile enthalten (in der Tat enthalten einige nur eine Zeile und andere eine bestimmte Anzahl von Zeilen), und dass sie alle dieselben Spalten haben (Namen und Arten). Falls es darauf ankommt, bin ich mir auch sicher, dass es in den Reihen keine NAs gibt.

Die Situation kann so simuliert werden:

#create one row
onerowdfr<-do.call(data.frame, c(list(), rnorm(100) , lapply(sample(letters[1:2], 100, replace=TRUE), function(x){factor(x, levels=letters[1:2])})))
colnames(onerowdfr)<-c(paste("cnt", 1:100, sep=""), paste("cat", 1:100, sep=""))
#reuse it in a list
someParts<-lapply(rbinom(200, 1, 14/200)*6+1, function(reps){onerowdfr[rep(1, reps),]})

Ich habe die Parameter (der Randomisierung) so eingestellt, dass sie sich meiner wahren Situation annähern.

Jetzt möchte ich all diese Daten in einem Datenrahmen vereinen. Ich dachte, rbind würde den Trick machen, so:

system.time(
result<-do.call(rbind, someParts)
)

Nun, auf meinem System (was nicht besonders langsam ist) und mit den obigen Einstellungen ist dies die Ausgabe der system.time:

   user  system elapsed 
   5.61    0.00    5.62

Fast 6 Sekunden für 254 (in meinem Fall) Reihen von 200 Variablen? Sicherlich muss es einen Weg geben, die Leistung hier zu verbessern? In meinem Code muss ich sehr oft ähnliche Dinge tun (es handelt sich um eine multiple Imputation), also muss ich so schnell wie möglich sein.


Kein großer Boost, aber das Austauschen von rbind für rbind.fill aus dem plyr Paket schlägt etwa 10% der Laufzeit (mit dem Beispiel-Dataset auf meinem Rechner).


Stellen Sie sicher, dass Sie den Datenrahmen an den Datenrahmen binden. Bei der Bindung der Liste an den Datenrahmen kam es zu einer enormen Leistungseinbuße.


Wenn Sie Ihren data.frame schneller data.frame möchten, würde ich vorschlagen, das Paket data.table und die Funktion rbindlist() . Ich habe keine umfangreichen Tests durchgeführt, aber für meinen Datensatz (3000 Datenrahmen, 1000 Zeilen x 40 Spalten) benötigt rbindlist() nur 20 Sekunden.







rbind