2009-10-13 3 views
19

많은 데이터 프레임을 병합하고 싶습니다. (잘못된 경우 여러 작업을 수행하는 것이 더 쉬울 것으로 보이기 때문에 쉽게 조정할 수 있습니다.)CSV 파일에서 많은 데이터 프레임을 병합합니다.

현 I 한 데이터 프레임과 같은 가지고

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

각 ID가 I는 각각의 ID에 대한/반복 측정 w CSV 파일을 가지고/여러 번의 측정

w 단일 행에, 같은 :

파일 이름 = ID_B.csv

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

난 내가하고 싶습니다 무엇 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, 
... 

난 정말 열 순서에 상관하지 않습니다. 내가 생각할 수있는 유일한 해결책은 각각의 CSV 파일에 ID 열을 추가 한 다음 merge() 번을 여러 번 호출하는 것입니다. 보다 우아한 접근 방식이 있습니까?

답변

15

제 생각에는 파일 이름에서 ID를 추출한 다음 가져온 CSV를 기존 데이터 프레임과 병합해야한다는 것입니다.

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) 

결과 :

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

오! 나는 각 csv가 하나의 ID에 대한 측정 값이라는 것을 완전히 놓쳤다. 도! 당신의 대답은 아주 좋습니다. –

+6

'mdply'가 아니라'ldply' 만 있으면됩니다. 또한'names (filenames) hadley

관련 문제