R) 전처리 - 파일-01

R) 전처리 - 파일-01

데이터 분석을 하다 보면 많은 수의 파일을 한 번에 모아서 분석해야 할 때가 있다. 이 때 사용하기 좋은 코드를 소개하고자 한다.

어쩌다가 10년치 데이터 분석을 한다고 가정해보자. 예를 들어 데이터가 1년 단위로 각각의 파일에 들어가있다면, 단순히 read.csv() 같은 함수를 10번 사용해서 코드를 작성할지도 모른다. 그런데 월별 데이터나 일별 데이터라면 어떻게 해야할까? 코드를 120번, 3650번씩 복사 붙여넣기를 하다보면 뭔가 잘못되었다고 생각하지 않을까? 생각보다 많은 사람들이 여기에서 포기한다. 하지만 생각보다 어렵지 않다. 다음 코드를 보자.

기본 코드

1
2
3
4
5
6
listt = list.files(pattern = "txt$") # 1
df = data.frame() # 2
for(file_path in listt){
df_sub = read.csv(file_path) # 3
df = rbind(df, df_sub) # 4
}

1번 코드의 list.files() 함수는 작업 폴더에 위치한 파일 및 하위폴더 목록을 출력해준다. 여기에서 pattern 인자에는 정규표현식을 사용 할 수 있으며 여기에서는 “txt$” 라고 입력하여 txt로 끝나는 파일명을 추출할 수 있도록 하였다. 단, 폴더명이 txt로 끝나는 폴더가 있다면 정확하게 txt 파일 확장자인 파일을 골라낼 수 없다.

2번 코드가 핵심이다. 모든 파일을 취합할 비어있는 데이터프레임을 생성해준다.

3번 코드에서 각 파일을 읽어와서 “df_sub” 객체에 저장하고, 4번 코드의 rbind() 함수를 사용하여 파일을 이어붙인다.

여기서 사용한 반복문의 코드를 보면 in 뒤에 “listt” 객체를 위치시켜 파일 경로를 하나씩 “file_path” 로 빼는 것을 볼 수 있다. R의 반복문 코드를 확실히 이해했다면 이 부분은 전혀 문제가 되지 않을 것이다.

응용

많은 파일이 작업폴더에 위치하는 경우는 흔치 않다. 파일이 많으면 난잡해지기 때문에 보통 특정 폴더에 별도 관리한다거나, 압축파일을 풀면서 별도의 하위 폴더에 위치하게 되는 경우가 대부분이다. 그래서 다음의 코드는 하위 폴더 “ABC”에 있는 txt 파일 확장자인 파일을 골라내어 병합하는 예제를 알아보도록 하겠다.

1
2
3
4
5
6
7
8
listt = list.files(pattern = "txt$",
path = "ABC",
full.names = TRUE) # 1
df = data.frame() # 2
for(file_path in listt){
df_sub = read.csv(file_path) # 3
df = rbind(df, df_sub) # 4
}

1번 코드만 변경되었다. 하위 폴더 “ABC”를 path 인자에 선언해주고, 파일명이 아니라 전체 경로를 얻어오기 위해 full.names 인자에 TRUE를 할당하였다. 종종 full.names 인자 설정을 누락하여 에러가 나는 경우가 많으니 조심하자.

그런데 “ABC” 폴더에 있는 하위 폴더 까지 모조리 뒤져서 내부에 있는 모든 txt 파일 확장자인 파일을 합치려면 어떻게 할까? 다행이도 list.files() 함수에는 recursive 인자가 있어 이를 TRUE로 설정해주면 문제 없다.

1
2
3
4
5
6
7
8
9
listt = list.files(pattern = "txt$",
path = "ABC",
full.names = TRUE,
recursive = TRUE) # 1
df = data.frame() # 2
for(file_path in listt){
df_sub = read.csv(file_path) # 3
df = rbind(df, df_sub) # 4
}

마치며

앞의 코드는 모든 파일의 형식이 같고 읽어왔을 때 데이터프레임 이라는 가정을 하고 실행하는 코드이다. 만약, 파일 제각각 변수 개수나 변수명이 다르다거나 하면 조건문을 붙여가면서 보다 복잡하게 코드를 작성해야 한다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×