2009-10-13 13 views
19

Vorrei unire un gruppo di frame di dati insieme (perché sembra che molte operazioni siano più semplici se si tratta solo di w/one, ma correggimi se ho torto).Unisci molti frame di dati da file CSV

Attualmente ho un frame di dati simili:

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

Ogni ID è una singola fila w/diverse misure singole

Ho anche un file CSV w/misurazione ripetuta per ogni ID, come:

nomefile = ID_B.csv

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

Quello che mi piacerebbe 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, 
... 

Non mi interessa davvero l'ordine delle colonne. L'unica soluzione a cui riesco a pensare è di aggiungere la colonna ID a ciascun file csv, quindi eseguirne il looping chiamando più volte lo merge(). C'è un approccio più elegante?

risposta

15

La mia comprensione è che è necessario estrarre l'ID dal nome file e quindi unire il csv importato con il dataframe esistente.

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) 

Risultato:

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! Ho perso totalmente che ogni CSV era la misura per un singolo ID. Doh! La tua risposta è molto buona. –

+6

Hai solo bisogno di 'ldply' e non di' mdply', e puoi anche semplificare le cose facendo 'nomi (nomi di file) <- ids'. Inoltre si usa '.' anziché' getwd() 'in' list.files'. Bella risposta altrimenti. – hadley

Problemi correlati