2016-06-20 12 views
0

Ich habe eine große Anzahl (über 200.000) separate Dateien, von denen jede eine einzelne Zeile und viele Spalten enthält (manchmal über mehrere hundert Spalten). Allen Dateien gemeinsam ist eine Spalte (id). Ansonsten sind die Spaltennamen halb zufällig, mit unvollständiger Überlappung zwischen Datenrahmen. Momentan verwende ich% in%, um zu bestimmen, welche Spalten gemeinsam sind und dann diese Spalten zusammenführen. Das funktioniert ganz gut, obwohl ich zuversichtlich bin (hoffentlich ist ein besseres Wort), dass es schneller gemacht werden könnte.Optimierte Art der Zusammenführung ~ 200k große [viele Spalten, aber nur eine Zeile] Datenrahmen mit unterschiedlichen Spaltennamen

Zum Beispiel:

dfone<-data.frame(id="12fgh",fred="1",wilma="2",barney="1") 
dftwo<-data.frame(id="36fdl",fred="5",daphne="3") 
common<-names(dfone)[names(dfone) %in% names(dftwo)] 
merged<-merge(dfone,dftwo,by=common,all=TRUE) 

Also, da ich eine große Anzahl von Dateien zu lesen, hier ist das, was ich jetzt mache:

fls<-list.files() 
first<-fls[1] 
merged<-read.csv(first) 

for (fl in fls) { 
dffl<-read.csv(fl) 
common<-names(dffl)[names(dffl) %in% names(merged)] 
merged<-merge(dffl,merged,by=common,all=TRUE) 
# print(paste(nrow(merged)," rows in dataframe.",sep="")) 
# flush.console() 
# print(paste("Just did ",fl,".",sep="")) 
# flush.console() 
} 

Offensichtlich die kommentierten aus Abschnitt ist nur ein Weg, um es zu verfolgen, wie es läuft. Was es ist, obwohl sehr langsam, und es läuft immer langsamer, während es den Datenrahmen zusammenbaut.

(1) Ich bin zuversichtlich, dass eine Schleife nicht der richtige Weg, dies zu tun, aber ich kann nicht einen Weg finden, um diese vektorisieren

(2) ist meine Hoffnung, dass es eine Möglichkeit ist die Zusammenführung zu tun, dass ich das bin fehlt beinhalten Vergleich meines Spaltennamen

(3) All das ist zu sagen, dass dies läuft viel zu langsam sein, tragfähige

Jeden Gedanken, wie nicht Flickschusterei um dieses Durcheinander zu optimieren? Vielen Dank im Voraus.

+0

'merge' ist standardmäßig auf' by = intersect (Namen (x), Namen (y)) '' gesetzt, so dass Sie 'common' nicht wirklich berechnen müssen. Der richtige Weg dazu ist wahrscheinlich [eine Liste von data.frames] (http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames/24376207#24376207). – alistaire

Antwort

1

Ein viel kürzerer und sauberer Ansatz ist es, sie alle in eine Liste zu lesen und dann zusammenzuführen.

do.call(merge, lapply(list.files(), read.csv)) Es wird aber immer noch langsam sein. Sie könnten es beschleunigen, indem Sie read.csv durch etwas schneller ersetzen (z. B. data.table::fread) und möglicherweise lapply durch parallel::mclapply ersetzen.

+0

Vielen Dank. Es beschleunigt auch Dinge durch Umformen der Datenrahmen von breit zu lang und rbinding statt zu verschmelzen - schneller um eine Größenordnung. Und ich bin mir sicher, wäre mit rbindlist noch schneller. – seehuus

Verwandte Themen