fs 패키지로 여러 파일 한 번에 병합하기
2019. 6. 11. 00:24ㆍ카테고리 없음

동일한 포맷의 여러개 파일을 동시에 불러온 다음, 일일히 bind_rows (혹은 rbind)를 해야할 때가 있다. for 반복문으로 붙이는 경우가 종종 있는데, fs 패키지를 사용할 경우 한 번에 간단히 끝낼 수 있다.
전시 카테고리
총 0 개의 데이터가 있습니다.
www.bigdatahub.co.kr
SK 데이터 허브에서, 패밀리 레스토랑 이용에 대한 월간 데이터를 병합하는 상황을 가정해보자. 2018년 1월부터 2019년 4월의 데이터를 CSV 형태로 다운받아 한 폴더에 넣어둔다.
동일한 형태로 정리가 잘되어 있기 때문에, 데이터 프레임 형식을 손볼 필요는 없다.

for 문을 사용하는 경우
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <code>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 < / code> |

성공적으로 병합이 되었다.
fs 패키지를 사용하는 경우
1 2 3 4 5 6 | <code>library(tidyverse) library(fs) list = dir_info( "family_restaurant" ,resurcive = T) % > % filter (str_detect(path, '\\.csv$' ) = = T) list < / code> |

dir_info는 지정한 경로에 있는 파일들의 정보를 표시한다
1 2 | <code>list2 = dir_ls( 'family_restaurant' , glob = '*.csv' ) < / code> |

dir_ls는 list.file과 비슷한 기능을 한다. 세부 명령어에 glob를 쓰면 *같은 와일드 카드를 사용할 수 있다.
1 2 3 4 5 6 7 8 | <code>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 < / code> |

훨씬 더 간편하게 파일이 병합된 것을 알 수 있다.
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