2014-01-16 6 views
22

Ich habe mehrere verschiedene TXT-Dateien mit der gleichen Struktur. Jetzt möchte ich sie mit fread in R einlesen und sie dann zu einem größeren Dataset zusammenfügen.Schnelles Lesen und Kombinieren mehrerer Dateien mit data.table (mit fread)

Der Code funktioniert gut, aber die Geschwindigkeit ist nicht zufriedenstellend. Jede TXT-Datei hat 1M Beobachtungen und 12 Felder.

Wenn ich die fread verwenden, um eine einzelne Datei zu lesen, ist es schnell. Aber mit apply, dann ist die Geschwindigkeit extrem langsam, und offensichtlich braucht viel Zeit, als Dateien nacheinander zu lesen. Ich frage mich, wo es hier schief gelaufen ist, gibt es Verbesserungen für den Geschwindigkeitsgewinn?

Ich versuchte die llply in plyr Paket, es gibt nicht viel Geschwindigkeitsgewinne.

Gibt es auch eine Syntax in data.table vertikale Verbindung wie rbind und union in sql zu erreichen?

Danke.

+0

Klar, das ein typo..I've ist bereits modifiziert. Danke Simon! – Bigchao

+0

Kommentar und aktualisierte Antwort entfernt. –

Antwort

34

Verwenden rbindlist(), die rbind zusammen ein list von data.table ‚s ausgelegt ist ...

mylist <- lapply(all.files, readdata) 
mydata <- rbindlist(mylist) 

Und als @Roland sagt, den Schlüssel nicht in jeder Iteration Ihrer Funktion gesetzt!

Also zusammenfassend, ist dies am besten:

l <- lapply(all.files, fread, sep=",") 
dt <- rbindlist(l) 
setkey(dt , ID, date) 
+3

Setzen Sie den Schlüssel auch nur einmal am Ende. – Roland

+0

@Roland guter Punkt. –

+0

@ SimonO'Hanlon, vielen Dank. Ist die for-Schleife schneller als platt? – Bigchao