fs 패키지로 여러 파일 한 번에 병합하기

2019. 6. 11. 00:24카테고리 없음

동일한 포맷의 여러개 파일을 동시에 불러온 다음, 일일히 bind_rows (혹은 rbind)를 해야할 때가 있다. for 반복문으로 붙이는 경우가 종종 있는데, fs 패키지를 사용할 경우 한 번에 간단히 끝낼 수 있다. 

 

전시 카테고리

총 0 개의 데이터가 있습니다.

www.bigdatahub.co.kr

SK 데이터 허브에서, 패밀리 레스토랑 이용에 대한 월간 데이터를 병합하는 상황을 가정해보자. 2018년 1월부터 2019년 4월의 데이터를 CSV 형태로 다운받아 한 폴더에 넣어둔다.

동일한 형태로 정리가 잘되어 있기 때문에, 데이터 프레임 형식을 손볼 필요는 없다. 

for 문을 사용하는 경우

library(tidyverse)
dir = 'family_restaurant'
files.list = paste0(dir,'/',list.files('family_restaurant'))
files.list

merged = NULL
for(i in seq(length(files.list))){
  temp = read_csv(files.list[i] %>% toString())
  merged = bind_rows(merged, temp)
}

merged %>% View()

head = c('type', 'year', 'month', 'day', 'days', 'state', 'county', 'town', 'sex', 'ages', 'ratio')
names(merged) = head

성공적으로 병합이 되었다.

fs 패키지를 사용하는 경우 

library(tidyverse)
library(fs)
list = dir_info("family_restaurant",resurcive = T) %>% 
  filter(str_detect(path, '\\.csv$') == T)
list

dir_info는 지정한 경로에 있는 파일들의 정보를 표시한다

list2 = dir_ls('family_restaurant', glob = '*.csv')

dir_ls는 list.file과 비슷한 기능을 한다. 세부 명령어에 glob를 쓰면 *같은 와일드 카드를 사용할 수 있다.

list2 = dir_ls('family_restaurant', glob = '*.csv')

merged2 = list2 %>% 
  map_df(read_csv, .id = 'file', col_types = cols())
head2 = c('file','type', 'year', 'month', 'day', 'days', 'state', 'county', 'town', 'sex', 'ages', 'ratio')
names(merged2) = head2
merged2

훨씬 더 간편하게 파일이 병합된 것을 알 수 있다.

fs패키지의 보다 자세한 명령어는 아래 페이지에서 찾아볼 수 있다.

 

Cross-Platform File System Operations Based on 'libuv'

A cross-platform interface to file system operations, built on top of the 'libuv' C library.

fs.r-lib.org