2009-10-13 27 views
19

Chciałbym scalić kilka ramek danych razem (ponieważ wydaje się, że wiele operacji jest łatwiejszych, jeśli zajmujesz się tylko jedną, ale popraw mnie, jeśli się mylę).Scalanie wielu ramek danych z plików CSV

Obecnie ma jedną ramkę danych w następujący sposób:

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

Każdy identyfikator jest jednym rzędzie w/kilka pojedynczych pomiarów

również mieć plik csv w/powtarzane miary dla każdego identyfikatora jak:

filename = ID_B.csv

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

Co bym jakbym 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, 
... 

Nie obchodzi mnie dokładnie kolejność kolumn. Jedynym rozwiązaniem, które mogę wymyślić jest dodanie kolumny ID do każdego pliku csv, a następnie przechodzenie przez nie kilka razy wywołując merge(). Czy istnieje bardziej eleganckie podejście?

Odpowiedz

15

Rozumiem, że należy wyodrębnić identyfikator z nazwy pliku, a następnie scalić zaimportowany plik CSV z istniejącą ramką danych.

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) 

Wynik:

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! Całkowicie przegapiłem, że każdy csv był pomiarem pojedynczego ID. Doh! Twoja odpowiedź jest bardzo dobra. –

+6

Potrzebujesz tylko 'ldply', a nie' mdply', a także możesz uprościć rzeczy, wykonując 'names (nazwy plików) <- ids'. Również używasz '.' zamiast' getwd() 'w' list.files'. Dobra odpowiedź inaczej. – hadley

Powiązane problemy