R/R basic

한 폴더에 있는 파일을 한꺼번에 불러서 통합시키기 (list.files / do.call 함수)

시키테이 2021. 4. 20. 00:41
반응형

이번에는 R에서 한 폴더에 있는 파일을 우르르 함께 불러서 이걸 통합시켜 보는 일을 해보려고 합니다. 여기서 통합이라고 하면 각 파일들이 동일한 칼럼들을 갖고 있어서 (칼럼 이름이 모두 일치) rbind를 통해서 쉽게 통합시킬 때만을 생각해봅니다.

 

우선 특정 폴더에 있는 파일 이름을 R에 부르는 일이 필요할 겁니다. 이 경우에는 list.files라는 함수를 사용하는데요. 우선 setwd()를 통해 자신의 working directory를 정해주시고, list.files로서 여기에 있는 파일 이름을 모두 읽어준 다음에 list 형태로 파일 이름을 (filenames라는 이름으로 해보겠습니다) 저장합니다. 파일이 총 몇개나 있는지 알고 싶으면 length 함수를 통해서 파일 이름을 저장한 list를 읽어주면 됩니다. 

setwd("/Users/xxx/Dropbox/googletrends")

filenames <- list.files(path=getwd())  
numfiles <- length(filenames)  

저는 2012년부터 2019년까지 제가 관심 있어 하는 검색어를 미국의 각 주별로 얼마나 검색했는지 매년 구글 트렌드 데이터를 긁어왔는데요. 아래처럼 모든 파일 이름들이 읽히고 각 csv 파일 총합이 8개인 것을 알고 있습니다. 

 

이제 이 파일을 통합해봅니다. 제 데이터는 앞에서 말씀드린 것처럼 각 파일이 동일한 이름의 칼럼을 갖고 있어서  join 같은 함수가 아니라 그냥 열만 더하는 rbind() 함수를 사용하면 됩니다. 다시 말해 google_2012.csv라는 파일은 "state", "googletrends", "year" 3개 열을 갖고 있는데 google_2013, google_2014도 다 동일한 칼럼만을 갖고 있음. 

 

MergedData <- 
  do.call(rbind, lapply(filenames, read.csv))

여기서는 do.call()과 lapply라는 함수를 동시에 사용했는데요. lapply는 각 파일을 read.csv라는 함수에 적용시켜라 (모든 google csv 파일이 열림), 그 다음에 이걸 rbind를 통해서 쫙 묶은 다음에 하나의 파일로 간단하게 만들어라 할 때 do.call을 사용합니다. do.call()은 rbind(칼럼 동일, 행만 더 함), cbind(행 동일, 칼럼만 더함)과 늘 함께 이용되니 잊지 마세용. 

 

이렇게 해서 MergedData라는 걸 새로 만들었는데 이렇게 하면 google 2012년자료부터 2019년자료까지 쫙 모아서 하나의 데이터를 만들어줍니다. 데이터 한 단면을 보여드리겠습니당. 

 

 

  조금 다른 경우를 봐서 예를 한 폴더에 있는 모든 csv 파일을 list 형태로 입력시켜라 하면 pattern이라는 조건문을 써주면 됩니다. 

 

myfiles = list.files(path=getwd(), pattern="*.csv", full.names=TRUE)

 

 

 

 

 

반응형