본문 바로가기
R 주제/통게분석(임시)

[R강의] 138. 엑셀파일 수백개를 자동으로 불러와서 for문과 rbind 이용하여 결합하기

by 만다린망고 2023. 1. 19.
반응형

아래와 같이 엑셀파일이 있다고 합시다. 어떤 도시에 사는 사람을 모집해서 나이와 키를 조사한 것입니다. 

 

 

도시마다 따로 조사했기 때문에 각각의 엑셀파일이 있습니다. 파일이 수백개라고 가정합시다.

 

 

R에서 엑셀파일을 불러오는 방법은 아래와 같습니다. 

setwd('경로')
read_excel('파일이름.xlsx')


예시는 아래와 같습니다. 아래 경로는 제 컴퓨터에 파일이 들어있는 경로이고, 경로는 여러분이 파일을 넣은 경로로 설정하셔야 합니다. 

library(readxl)
library(dplyr)

setwd('C:/Users/PC1/Documents/data')

df1=read_excel("city1.xlsx") %>% as.data.frame


만약 엑셀파일이 수백개라면 마지막줄을 백번 적어야 합니다. df1,df2,df3 과 같이 변수명을 바꿔가면서요. 

위 과정을 편하게 해봅시다. 먼저 폴더 안에 있는 파일 목록을 불러와서 FileName 에 저장합니다. 

FileName=list.files()


콘솔창에 FileName을 입력해보면 아래와 같이 출력됩니다. 

> FileName
[1] "city1.xlsx" "city2.xlsx" "city3.xlsx" "city4.xlsx" "city5.xlsx"


이제 for문으로 불러올건데요. 불러온 결과들은 list에 저장하면 됩니다. list는 이런 경우에 주로 쓰입니다. list의 각 원소에는 뭐든 넣을 수 있기 때문에 각 원소에 데이터프레임을 하나씩 넣어주면 됩니다. 

먼저 비어있는 리스트를 하나 선언합니다. 

ls=list()


엑셀파일을 하나씩 불러와서 리스트 각 원소에 넣어줍니다. 

for (i in 1:length(FileName)){
  ls[[i]]=read_excel(FileName[i]) %>% as.data.frame
}


리스트의 첫번째 원소에 접근하면, 첫번째 파일인 것을 알 수 있습니다. 

> ls[[1]]
  id 나이  키
1  1   50 162
2  2   23 165
3  3   14 180
4  4   13 171
5  5   20 176


파일을 합쳐줄 건데요. 그냥 합치면 각 행이 어느 도시에 속해있는지 알 수 없습니다. 위에서 만든 for문을 약간 수정하여 도시를 나타내는 열을 추가해줍니다. 

for (i in 1:length(FileName)){
  ls[[i]]=read_excel(FileName[i]) %>% as.data.frame
  ls[[i]]['city']=FileName[i]
}

 

> ls[[1]]
  id 나이  키       city
1  1   50 162 city1.xlsx
2  2   23 165 city1.xlsx
3  3   14 180 city1.xlsx
4  4   13 171 city1.xlsx
5  5   20 176 city1.xlsx


.xlsx가 붙어있는데 제거해줍시다. gsub 함수를 사용하여 아래와 같이 for문을 수정합니다. '.xlsx' 를 '' 로 바꿔준 겁니다. 없애준 것과 같습니다. 

for (i in 1:length(FileName)){
  ls[[i]]=read_excel(FileName[i]) %>% as.data.frame
  ls[[i]]['city']=gsub('.xlsx','',FileName[i])
}

 

> ls[[1]]
  id 나이  키  city
1  1   50 162 city1
2  2   23 165 city1
3  3   14 180 city1
4  4   13 171 city1
5  5   20 176 city1



이제 데이터프레임을 결합해줍시다. 단순히 rbind 를 이용하여 결합하면 손이 너무 많이갑니다. 

rbind(ls[[1]],ls[[1]],.....)


do.call 함수를 사용합시다. 리스트 원소를 한데 모아서 원하는 함수를 적용하게 해줍니다. 아래와 같이 사용합니다. 

df_all=do.call(rbind, ls)


아래와 같이 예쁘게 잘 결합됐습니다. 

> df_all
   id 나이  키  city
1   1   50 162 city1
2   2   23 165 city1
3   3   14 180 city1
4   4   13 171 city1
5   5   20 176 city1
6   1   39 155 city2
7   2   37 173 city2
8   3   24 187 city2
9   4   40 185 city2
10  5   42 140 city2
11  1   39 155 city3
12  2   37 173 city3
13  3   24 187 city3
14  4   40 185 city3
15  5   42 140 city3
16  1   39 155 city4
17  2   37 173 city4
18  3   24 187 city4
19  4   40 185 city4
20  5   42 140 city4
21  1   39 155 city5
22  2   37 173 city5
23  3   24 187 city5
24  4   40 185 city5
25  5   42 140 city5


오늘 사용한 코드를 모아보면 아래와 같습니다. 

library(readxl)
library(dplyr)

setwd('C:/Users/PC1/Documents/data')

df1=read_excel("city1.xlsx") %>% as.data.frame

FileName=list.files()

ls=list()

for (i in 1:length(FileName)){
  ls[[i]]=read_excel(FileName[i]) %>% as.data.frame
  ls[[i]]['city']=gsub('.xlsx','',FileName[i])
}


폴더 안에 있는 엑셀파일이 100개건, 1000개건 상관없이 위 코드면 충분합니다. 이것이 바로 코딩의 위력입니다. 

반응형

댓글