2009-10-13 7 views
19

Ich möchte eine Reihe von Datenrahmen zusammenführen (weil es scheint, viele Operationen sind einfacher, wenn Sie nur mit einem zu tun haben, aber korrigieren Sie mich, wenn ich falsch liege).Verschmelzen Sie viele Datenrahmen aus CSV-Dateien

Derzeit ein Datenrahmen wie diese habe ich:

ID, var1, var2 
A, 2, 2 
B, 4, 5 
. 
. 
Z, 3, 2 

Jede ID auf einer einzigen Zeile w/mehrere Einzelmessungen

I w/wiederholte Messung für jede ID auch eine CSV-Datei haben, wie:

filename = ID_B.csv

time, var4, var5 
0, 1, 2 
1, 4, 5 
2, 1, 6 
... 

Was würde ich ich mag s:

ID, time, va1, var2, var4, var5 
... 
B, 0, 4, 5, 1, 2, 
B, 1, 4, 5, 4, 5, 
B, 2, 4, 5, 1, 6, 
... 

Ich interessiere mich nicht wirklich für die Spaltenreihenfolge. Die einzige Lösung, die ich mir vorstellen kann, besteht darin, jeder csv-Datei die ID-Spalte hinzuzufügen und sie dann mehrmals durchlaufen zu lassen, indem sie merge() mehrmals aufruft. Gibt es einen eleganteren Ansatz?

Antwort

15

Mein Verständnis ist, dass Sie die ID aus dem Dateinamen extrahieren müssen, und dann die importierte CSV mit dem vorhandenen Datenrahmen zusammenführen.

df1 <- read.csv(textConnection("ID, var1, var2 
A, 2, 2 
B, 4, 5")) 

# assuming the imported csv-files are in working directory 
filenames <- list.files(getwd(), pattern = "ID_[A-Z].csv") 

# extract ID from filename 
ids <- gsub("ID_([A-Z]).csv", "\\1", filenames) 

# import csv-files and append ID 
library(plyr) 
import <- mdply(filenames, read.csv) 
import$ID <- ids[import$Var1] 
import$Var1 <- NULL 

# merge imported csv-files and the existing dataframe 
merge(df1, import) 

Ergebnis:

ID var1 var2 time var4 var5 
1 B 4 5 0 1 2 
2 B 4 5 1 4 5 
3 B 4 5 2 1 6 
+0

Oh! Ich habe total vermisst, dass jeder csv die Maße für eine einzige ID war. Do! Deine Antwort ist sehr gut. –

+6

Sie brauchen nur 'ldply' und nicht' mdply', und Sie können auch Dinge vereinfachen, indem Sie 'names (filenames) <- ids' machen. Außerdem verwenden Sie '.' anstelle von' getwd() 'in' list.files'. Schöne Antwort anders. – hadley

Verwandte Themen