2014-04-07 5 views
0

주어진 폴더에서 모든 csv 파일을 가져 와서 하나의 파일로 병합하는 프로젝트를 진행 중입니다. 폴더의 각 파일에서 원하는 행과 열을 가져올 수 있었지만 지금은 모든 파일을 하나의 파일로 병합하는 데 도움이 필요합니다. 나는 결국 (아마 주위 120)와 끝까지 얼마나 많은 파일 모르는 내가 여기에 1하나의 데이터 프레임에 df.1, df.2, df.3 ... df.x를 병합

에 의해 그들에게 일을 병합하지 않으려는 것은 내가 지금까지 무엇을 가지고 :

# Import All files 
rowsToUse <- c(9:104,657:752) 
colsToUse <- c(15,27,28,29,30,33,35) 
filenames <- list.files("save", pattern="*.csv", full.names=TRUE) 
for (i in seq_along(filenames)) { 
    assign(paste("df", i, sep = "."), read.csv(filenames[i])[!is.na(30),][rowsToUse,colsToUse]) 
} 

# Merge into one file 
for (i in seq_along(filenames)) { 
    df<-rbind(df.[i]) 
} 

코드의 첫 번째 부분은 df.1, df.2 등의 일련의 데이터 프레임을 만듭니다. df라는 하나의 최종 데이터 프레임으로 끝내기를 바랍니다. 모든 파일의 구조는 동일합니다.

누군가가 몇 분 더 있으면 정말 도움이 될 것입니다. 고맙습니다! 이미있는 파일을 읽고 때문에

+2

먼저 목록으로 읽어 들인 다음 do.call (rbind, your_list)를 사용하십시오. – A5C1D2H2I1M1N2O1R2T1

답변

3

는 다음을 시도 할 수 있습니다 :

do.call(rbind, mget(ls(pattern = "df"))) 

ls(pattern = df) 등등 당신의 "df.1", "df.2"모두를 캡처하고 있습니다. 다행스럽게도 같은 패턴으로 명명 된 다른 것들을 가지지 않기를 바란다. 그렇지만 커맨드가 단지 data.frame으로 나타날 때까지 더 엄격한 패턴으로 실험 해 보라.

mget()을 사용하면 에 do.call(rbind, ...)을 사용할 수 있습니다.

+0

이것은 어떻게 작동하는지에 대한 좋은 설명과 함께 빠르고 쉬운 해결책이었습니다. 상대적으로 새로운 R 사용자인데 나는 ls() 또는 mget() 명령에 대해 들어 보지 못했고 설명을 높이 평가했습니다. – Xander

4

모두 복잡해 보입니다. 위의 대답은 "매우 비슷한 이름의 개체 목록이 있는데 어떻게 처리 할 것인가?"에서 작동하는 것 같습니다. 대답 : 그들은 매우 비슷한 이름을 가질 필요가 없습니다. 그들은 다른 대상 일 필요조차 없습니다.

for 루프를 통하지 않고 lapply()를 통해 파일을 읽으면 모든 데이터 프레임을 포함하는 단일 객체를 얻습니다. 각 객체는 단일 요소입니다. 이들은 추출 될 수 있습니다. 그러면 다음과 같은 모습을 보일 것입니다.

#Grab a list of filenames 
filenames <- list.files("save", pattern="*.csv", full.names=TRUE) 

#Iterate through that list of names, using lapply(), reading the data in. 
list_of_data_frames <- lapply(filenames, function(x){ 

    #Read the data in 
    to_return <- read.csv(x)[!is.na(30),][c(9:104,657:752),c(15,27,28,29,30,33,35)]) 

    #Return it. You could save lines of code (and processor time!) by just reading 
    #straight into return(), but it would be a lot less clear. 
    return(to_return) 
}) 

#Now use do.call to turn it into a single data frame. 
data.df <- do.call("rbind", list_of_data_frames) 
+0

'위의 답변은 "매우 비슷한 이름의 객체 목록이 있습니다. 어떻게 처리할까요?"- 글쎄, 그건 우리가 가진 것입니다 :-) – A5C1D2H2I1M1N2O1R2T1

+2

또한' 'read.csv'의 출력을 처음부터 아무 것도 지정하지 않음으로써 return (to_return)을 만들지 만 위의 내 의견에 대해 정교하게 대답하는 경우 +1을 사용합니다 ... – A5C1D2H2I1M1N2O1R2T1

+0

좋은 제안! 내 친구 중 한 명이 R을 몇 년 동안 쓰고 있으며 3 개월 전에 명시적인 return() 호출이 있음을 발견했습니다. 그리고 네, 그것이 우리가 가진 것입니다. 그러나 우리는 필요하지 않습니다. 그것은 존재할 필요가없는 문제입니다. 왜 그렇게 하시겠습니까? ;). –