데이터 형태 변환

library('tidyverse')
library('readxl')
long_data = read_xls("data_library.xls") %>% 
  filter(자치구=='서대문구') %>% 
  select(기간, 자치구, 공공도서관)
long_data
## # A tibble: 7 x 3
##   기간  자치구   공공도서관
##   <chr> <chr>         <dbl>
## 1 2010  서대문구          3
## 2 2011  서대문구          4
## 3 2012  서대문구          4
## 4 2013  서대문구          4
## 5 2014  서대문구          4
## 6 2015  서대문구          4
## 7 2016  서대문구          4


# 넓은 형태의 데이터로 변환
wide_data = long_data %>% 
  spread(key=기간, value=공공도서관)
wide_data
## # A tibble: 1 x 8
##   자치구   `2010` `2011` `2012` `2013` `2014` `2015` `2016`
##   <chr>     <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 서대문구      3      4      4      4      4      4      4


# 다시 긴 형태의 데이터로 재변환
long_data2 = wide_data %>% 
  gather(key=기간, value=공공도서관, -자치구)
# 자치구 변수의경우 반복측정된 변수가 아니기 때문에 "-자치구" 형태로 형태변환 대상이 아닌 경우에는 -를 붙여 주어야함
long_data2
## # A tibble: 7 x 3
##   자치구   기간  공공도서관
##   <chr>    <chr>      <dbl>
## 1 서대문구 2010           3
## 2 서대문구 2011           4
## 3 서대문구 2012           4
## 4 서대문구 2013           4
## 5 서대문구 2014           4
## 6 서대문구 2015           4
## 7 서대문구 2016           4

조금 더 복잡한 사례

long_data = read_xls("data_library.xls") %>%
  select(기간, 자치구, 공공도서관)
long_data
## # A tibble: 182 x 3
##    기간  자치구   공공도서관
##    <chr> <chr>         <dbl>
##  1 2010  합계            101
##  2 2010  종로구            4
##  3 2010  중구              2
##  4 2010  용산구            3
##  5 2010  성동구            4
##  6 2010  광진구            3
##  7 2010  동대문구          2
##  8 2010  중랑구            2
##  9 2010  성북구            3
## 10 2010  강북구            5
## # ... with 172 more rows
# 자치구를 key로 지정할 경우
wide_data1 = long_data %>% 
  spread(key=자치구, value=공공도서관)
wide_data1
## # A tibble: 7 x 27
##   기간  강남구 강동구 강북구 강서구 관악구 광진구 구로구 금천구 노원구
##   <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 2010      11      7      5      5      4      3      9      3      4
## 2 2011      11      7      5      5      5      3     10      3      5
## 3 2012      11      7      5      7      5      3     10      3      6
## 4 2013      12      7      6      8      5      3     10      4      6
## 5 2014      12      7      6      8      5      3     10      4      6
## 6 2015      12      7      6      9      5      4     10      4      6
## 7 2016      11      7      6      9      5      4     10      4      6
## # ... with 17 more variables: 도봉구 <dbl>, 동대문구 <dbl>, 동작구 <dbl>,
## #   마포구 <dbl>, 서대문구 <dbl>, 서초구 <dbl>, 성동구 <dbl>,
## #   성북구 <dbl>, 송파구 <dbl>, 양천구 <dbl>, 영등포구 <dbl>,
## #   용산구 <dbl>, 은평구 <dbl>, 종로구 <dbl>, 중구 <dbl>, 중랑구 <dbl>,
## #   합계 <dbl>
# 기간을 key로 지정할 경우
wide_data2 = long_data %>% 
  spread(key=기간, value=공공도서관)
wide_data2
## # A tibble: 26 x 8
##    자치구 `2010` `2011` `2012` `2013` `2014` `2015` `2016`
##    <chr>   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
##  1 강남구     11     11     11     12     12     12     11
##  2 강동구      7      7      7      7      7      7      7
##  3 강북구      5      5      5      6      6      6      6
##  4 강서구      5      5      7      8      8      9      9
##  5 관악구      4      5      5      5      5      5      5
##  6 광진구      3      3      3      3      3      4      4
##  7 구로구      9     10     10     10     10     10     10
##  8 금천구      3      3      3      4      4      4      4
##  9 노원구      4      5      6      6      6      6      6
## 10 도봉구      4      5      5      5      5      7      7
## # ... with 16 more rows

데이터 합치기

# 두개의 데이터 열기
seoul_library = read_xls('data_library.xls')
seoul_educ = read_xls('data_student_class.xls',skip=2)
## New names:
## * 학급수 -> 학급수...4
## * 학생수 -> 학생수...6
## * 학급수 -> 학급수...7
## * 학급당학생수 -> 학급당학생수...8
## * 학생수 -> 학생수...9
## * ...
# 설명의 편의를 위해 간단한 데이터로 바꿈
mydata1 = seoul_library %>% 
  filter(기간==2016 & 자치구!='합계') %>% 
  select(1:3)
mydata2 = seoul_educ %>% 
  filter(기간==2016 & 지역!='합계') %>% 
  select(1:3)
# 변수 이름 조정 후 합치기
names(mydata1)=c('year','district','lib_total')
names(mydata2)=c('year','district','stdt_kinder')
mydata1 %>% 
  full_join(mydata2,by='district')
## # A tibble: 25 x 5
##    year.x district lib_total year.y stdt_kinder
##    <chr>  <chr>        <dbl> <chr>        <dbl>
##  1 2016   종로구          50 2016          1330
##  2 2016   중구            57 2016          1176
##  3 2016   용산구          20 2016          1779
##  4 2016   성동구           8 2016          2584
##  5 2016   광진구          10 2016          3174
##  6 2016   동대문구        18 2016          3388
##  7 2016   중랑구           6 2016          3366
##  8 2016   성북구          21 2016          5243
##  9 2016   강북구          11 2016          2105
## 10 2016   도봉구           8 2016          3027
## # ... with 15 more rows
# 식별 변수가 2개 이상인 경우
mydata1 %>% 
  full_join(mydata2,by=c('year','district'))
## # A tibble: 25 x 4
##    year  district lib_total stdt_kinder
##    <chr> <chr>        <dbl>       <dbl>
##  1 2016  종로구          50        1330
##  2 2016  중구            57        1176
##  3 2016  용산구          20        1779
##  4 2016  성동구           8        2584
##  5 2016  광진구          10        3174
##  6 2016  동대문구        18        3388
##  7 2016  중랑구           6        3366
##  8 2016  성북구          21        5243
##  9 2016  강북구          11        2105
## 10 2016  도봉구           8        3027
## # ... with 15 more rows