2009-10-13 10 views
19

Me gustaría combinar un conjunto de marcos de datos (porque parece que muchas operaciones son más sencillas si solo se trata de w/one, pero corrígeme si me equivoco).Combinar muchos marcos de datos de archivos csv

Actualmente tengo una trama de datos como esta:

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

Cada ID está en una sola fila w/varias mediciones individuales

También tengo un archivo csv w/medición repetida para cada ID, como:

archivo = ID_B.csv

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

Lo que me gustaría i 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, 
... 

Realmente no me importa el orden de las columnas. La única solución en la que puedo pensar es agregar la columna ID a cada archivo csv y luego recorrerlos llamando al merge() varias veces. ¿Hay un enfoque más elegante?

Respuesta

15

Según tengo entendido, debe extraer el ID del nombre del archivo y luego combinar el csv importado con el dataframe existente.

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) 

Resultado:

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! Extrañaba totalmente que cada csv fuera la medida de una única ID. Doh! Tu respuesta es muy buena –

+6

Solo necesita 'ldply' y no' mdply', y también puede simplificar las cosas haciendo 'names (filenames) <- ids'. También usa '.' en lugar de' getwd() 'en' list.files'. Buena respuesta de lo contrario. – hadley