brunch

You can make anything
by writing

C.S.Lewis

by 쩐시 Aug 19. 2021

R 프로그래밍 - 2021 서울대기오염 분석 1

엑셀 데이터 결합

공공데이터 사례분석 공부를 통해 논문의 완벽성을 높히고자 교재를 빌려 공부하고 있다.

* 교재명:R을 이용한 공공데이터 분석(2021)


그 중 첫 번째 프로젝트는 1년치 서울미세먼지 데이터 분석이다.

교재에서는 2019년 1년치 데이터 파일을 제공했지만, 나는 최신 데이터를 쓰고 싶어서 직접 '서울특별시 대기환경정보 웹사이트'에 방문하여 20200817~20210817의 데이터를 분할하여 통합하고자 했다. 그 결과 엄청난 고난의 시작...은 예상하지 못했다 ㅠ


그 고난의 Process를 아래에 순서대로 적어보았다.

내가 겪은 문제들을 다른 사람들도 필히 겪으리라 느끼면서 도움이 되었으면 한다!




아래 사이트에서 2달치 씩(60일이내) 1년치 데이터를 다운받아야 한다. 

https://cleanair.seoul.go.kr/statistics/periodAverage


고로, 나는 아래와 같이 총 7개의 테이블을 만들어야 했다.  

"library(readxl)" 


period1<- read_excel('period.xlsx', sheet = 1, col_names = T)

period2<- read_excel('period (1).xlsx', sheet = 1, col_names = T)

period3<- read_excel('period (2).xlsx', sheet = 1, col_names = T)

period4<- read_excel('period (3).xlsx', sheet = 1, col_names = T)

period5<- read_excel('period (4).xlsx', sheet = 1, col_names = T)

period6<- read_excel('period (5).xlsx', sheet = 1, col_names = T)

period7<- read_excel('period (6).xlsx', sheet = 1, col_names = T)


그리고 위 아래로 전체 날짜를 통합하는 테이블을 만들어야하기 때문에 row_bind 함수를 이용했다. 뭐 우선 일단 통합시키고나서 해결해야할 문제를 찾고자 함...

df<- bind_rows(period1, period2, period3, period4, period5, period6, period7)


제대로 확인하기 위해 excel 을 통해 확인한다

write.csv(df, file = "20200817~20210817.csv")


결과 아래와 같이 확인 되었다. 보니까 문제가 없는 듯 해서 된건가? 

설마.. 했더니 역시나 문제가 많았다... 눈물

20200817~20210817.csv


최우선 문제는 이 df 테이블의 6행 이전 데이터가 period1~7까지 반복되어 들어갔다는 것이다. 아무래도 같은 형식의 공공 데이터 파일들이라 예상은 했다.

아래 파일은 대충 필터를 걸어 확인했던 것인데, "전체"가 7번 중복 되어 들어간 것을 볼 수 있다. 이것 말고도 그 위의 행들도 중복되어 들어갔을 것...


그래서 처음에는 distinct() 함수로 지우면 되지 않겠는가 싶어서 도전해봤는데도 이 중복 행들이 없어지지 않았다!

df_new<- bind_rows(period1, period2, period3, period4, period5, period6, period7) %>% distinct()


그 이유는 정확하진 않지만, 위의 엑셀 파일을 보면 "측정일시: 해당 구간"의 날짜도 파일마다 다르고, 또 "전체" 행의 평균 값도 다 다르니... 전문가가 아니라 쏙쏙 특정 구간만 추출하여 한번에 통합할 수 없는 나는 결국 각 period 파일들의 상단부들을 다 날리고 통합하기로 했다.


작전은 이렇하다. 뭔가 원시적인 느낌...ㅋㅋ

1. read.excel의 skip 가능을 활용하여, 각 7개 파일들의 6번째 행부터 불러오기로 수정

2. 위의 header는 따로 제작하여 붙인다


1번 부터,

period1<- read_excel('period.xlsx', sheet = 1, col_names = F, skip = 6)

period2<- read_excel('period (1).xlsx', sheet = 1, col_names = F, skip = 6)

period3<- read_excel('period (2).xlsx', sheet = 1, col_names = F, skip = 6)

period4<- read_excel('period (3).xlsx', sheet = 1, col_names = F, skip = 6)

period5<- read_excel('period (4).xlsx', sheet = 1, col_names = F, skip = 6)

period6<- read_excel('period (5).xlsx', sheet = 1, col_names = F, skip = 6)

period7<- read_excel('period (6).xlsx', sheet = 1, col_names = F, skip = 6)


df_new<- bind_rows(period1, period2, period3, period4, period5, period6, period7) 


write.csv(df_new, file = "20200817~20210817_new.csv")


결과는 아래와 같다


우선 성공했다. 중복되었던 위의 행들을 다 제거했기 때문에 사실 단순 테이블 결합이라 문제가 없었지만, 이대로 위의 header 없이 한다는게 자존심이 상해, 또 구글을 통해 사방팔방으로 header 추가하는 법을 검색했다.


2. header 추가하기


사실 처음에는 period 파일들에서 header 부분만 따로 추출하여 위의 df_new 와 결합하려고 했다. 정말이지 초보자의 생각....이였다.


period_header<- read_excel('period.xlsx', sheet = 1, col_names = F, range = 'A4:H4')

위와 같이 기존 period 파일에서 특정 행을 추출하여 period_header을 만들어서 확인해 보았다. 

그래서 이렇게 다른 데이터 유형의 테이블들을 결합할 수 있나, 이것저것 시도해보고 알아보았더니 안된다고 한다.  왜냐하면 df_new는 num 덩어리들이지만 위의 따로만들어본 header테이블은 cha 들이라 방법이 없음,,,


그리고 발견한 colname()  기능!! 예전에 잠깐 공부했던 기억이...

아래와 같이 df_new 자체에 header를 지정해서 직접적으로 추가시키는 것이다.


colnames(df_new) <- c("날짜","측정소명", "미세먼지 PM10\n(\u338d/m3)", "초미세먼지\nPM2.5 (\u338d/m3)", "오존\nO3 (ppm)", "이산화질소\nNO2 (ppm)", "일산화탄소\nCO (ppm)",  "아황산가스\nSO2(ppm)" )


write.csv(df_new, file = "20200817~20210817_new_header.csv") 


뽑아서 보니, 성공!!


위의 파일과 같이 성공적으로 header가 추가된 것을 확인 할 수 있다.


지금 돌이켜 생각해보면, 애초에 각 period1~7 데이터프레임을 만들때부터 이렇게 header로 할 특정행과 데이터 부분들만 뽑아서 row_bind 했으면 됐을까? 생각해보니, 또 중간에 평균행이 들어가 있어서, 그냥 나같은 초보자는 위에 다 싹다 자르고 나중에 colnames로 header 추가하는 것을 추천한다...흡

작가의 이전글 R 프로그래밍 - 비슷한 어문2
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari