Excel로 저장된 주민등록 인구수를 R로 읽어 tidy 데이터로 변환하기

2020-06-24

춘천시의 읍면동별 인구현황과 함께 어떤 변화가 있었는지 알아보겠습니다.

데이터 얻기

주민등록 인구

위의 링크 중 행정안전부 주민등록인구통계를 통해 춘천의 읍면동별 년간 인구와 읍면동별 년간 5세단위 자료를 다운로드 받아 몇가지 인사이트를 얻고자 합니다. 다음은 행정안전부에서 제공하는 자료에 대한 간략한 설명입니다.

  • 주민등록 인구와 세대수와 연령별 인구현황을 별도의 메뉴로 제공하고 있으며, 행정구역, 조회기간 등을 사용자로 부터 입력받아 해당 자료의 크기에 따라 검색 기간의 제한이 있습니다.
  • 제공하는 파일의 유형은 csv와 Excel의 두가지입니다.

데이터 읽기

dat1 <- read_excel("./data/pops/cc/200812_201012_연령별인구현황_연간.xlsx")

Excel은 기본적으로 데이터와 다른 객체(설명, 그래프, 요약 값등)가 분리되지 않아 데이터를 살펴볼 필요가 있습니다. 다음은 위의 데이터를 다운로드 받은후 파악한 제공데이터의 특성입니다.

  • 첫줄에 있는 자료는 데이터가 아닌 설명을 담고 있습니다.
  • 각 열의 제목이 여러 행에 걸쳐 있습니다.
  • 또한, 각 열의 제목이 여러 열을 병합한 후 지정되어 있습니다.
  • 3열부터는 각 년도별, 분류별(계, 남, 여)로 5세 단위 인구를 기록했습니다.
    • 각 년도별 구분별 인구에는 앞 부분에 합에 해당하는 두 개의 인구수가 있습니다.
  • 실제 데이터는 5행 부터 시작됩니다. (변수명 포함시 4행부터)
dat1
## # A tibble: 6 × 209
##   ※ 매년 말일자 통계 현…¹ ...2  ...3   ...4  ...5  ...6  ...7  ...8  ...9  ...10
##   <chr>                   <chr> <chr>  <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 <NA>                    <NA>  2008년 <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
## 2 <NA>                    <NA>  계     <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
## 3 행정기관코드            행정… 총 인… 연령… 0~4세 5~9세 10~1… 15~1… 20~2… 25~2…
## 4 4211000000              강원… 261975 2619… 11381 15326 18927 18260 17214 19038
## 5 4211025000              강원… 7531   7531  264   289   353   433   459   481  
## 6 4211031000              강원… 6025   6025  284   331   333   375   376   381  
## # ℹ abbreviated name: ¹​`※ 매년 말일자 통계 현황`
## # ℹ 199 more variables: ...11 <chr>, ...12 <chr>, ...13 <chr>, ...14 <chr>,
## #   ...15 <chr>, ...16 <chr>, ...17 <chr>, ...18 <chr>, ...19 <chr>,
## #   ...20 <chr>, ...21 <chr>, ...22 <chr>, ...23 <chr>, ...24 <chr>,
## #   ...25 <chr>, ...26 <chr>, ...27 <chr>, ...28 <chr>, ...29 <chr>,
## #   ...30 <chr>, ...31 <chr>, ...32 <chr>, ...33 <chr>, ...34 <chr>,
## #   ...35 <chr>, ...36 <chr>, ...37 <chr>, ...38 <chr>, ...39 <chr>, …

열 이름 재지정하기

위에서 읽어온 자료의 경우 Excel 파일의 첫번째 행의 값을 변수명으로 판단하고 있으며, 두번째 행부터 자료로 읽어왔다. 이렇게 읽어온 자료는 변수 dat1에 tibble 형태로 저장되어 있으며, 이 자료 중 첫번째 행은 년도 정보를 갖고 있습니다.

  • paste() 함수를 이용하여 첫번째 행의 각 데이터를 문자열 데이터로 만들어 확인하면 다음과 같습니다.
paste( dat1[1, ] )
##   [1] "NA"     "NA"     "2008년" "NA"     "NA"     "NA"     "NA"     "NA"    
##   [9] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
##  [17] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
##  [25] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
##  [33] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
##  [41] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
##  [49] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
##  [57] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
##  [65] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "2009년"
##  [73] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
##  [81] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
##  [89] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
##  [97] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [105] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [113] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [121] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [129] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [137] "NA"     "NA"     "NA"     "NA"     "2010년" "NA"     "NA"     "NA"    
## [145] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [153] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [161] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [169] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [177] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [185] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [193] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [201] "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"     "NA"    
## [209] "NA"
  • 갖고 있는 값들만으로 만들기 위해 ifelse()를 이용하여 “NA”NA로 만들고 그렇지 않을 경우, 즉 값을 갖고 있으면 기존 값을 그대로 사용
  • 이렇게 만들어지 벡터를 테이블 함수를 이용하여 값 확인
  • 테이블의 열이름이 우리 데이터의 년도 정보
ifelse( paste(dat1[1, ]) == "NA", NA, paste(dat1[1, ]) )
##   [1] NA       NA       "2008년" NA       NA       NA       NA       NA      
##   [9] NA       NA       NA       NA       NA       NA       NA       NA      
##  [17] NA       NA       NA       NA       NA       NA       NA       NA      
##  [25] NA       NA       NA       NA       NA       NA       NA       NA      
##  [33] NA       NA       NA       NA       NA       NA       NA       NA      
##  [41] NA       NA       NA       NA       NA       NA       NA       NA      
##  [49] NA       NA       NA       NA       NA       NA       NA       NA      
##  [57] NA       NA       NA       NA       NA       NA       NA       NA      
##  [65] NA       NA       NA       NA       NA       NA       NA       "2009년"
##  [73] NA       NA       NA       NA       NA       NA       NA       NA      
##  [81] NA       NA       NA       NA       NA       NA       NA       NA      
##  [89] NA       NA       NA       NA       NA       NA       NA       NA      
##  [97] NA       NA       NA       NA       NA       NA       NA       NA      
## [105] NA       NA       NA       NA       NA       NA       NA       NA      
## [113] NA       NA       NA       NA       NA       NA       NA       NA      
## [121] NA       NA       NA       NA       NA       NA       NA       NA      
## [129] NA       NA       NA       NA       NA       NA       NA       NA      
## [137] NA       NA       NA       NA       "2010년" NA       NA       NA      
## [145] NA       NA       NA       NA       NA       NA       NA       NA      
## [153] NA       NA       NA       NA       NA       NA       NA       NA      
## [161] NA       NA       NA       NA       NA       NA       NA       NA      
## [169] NA       NA       NA       NA       NA       NA       NA       NA      
## [177] NA       NA       NA       NA       NA       NA       NA       NA      
## [185] NA       NA       NA       NA       NA       NA       NA       NA      
## [193] NA       NA       NA       NA       NA       NA       NA       NA      
## [201] NA       NA       NA       NA       NA       NA       NA       NA      
## [209] NA
table( ifelse( paste( dat1[1, ] ) == "NA", NA, paste(dat1[1, ]) ) )
## 
## 2008년 2009년 2010년 
##      1      1      1
names( table( ifelse( paste( dat1[1, ] ) == "NA", NA, paste(dat1[1, ]) ) ) )
## [1] "2008년" "2009년" "2010년"

이제 본 자료는 2008년, 2009년, 2010년와 같은 년도 자료를 갖고 있음을 확인할 수 있습니다.

다음으로 위의 자료에서 두번째 행이 갖고 있는 정보는 어떤 분류를 갖고 있는지에 대한 것으로 위와 마찬가지로 그 값을 확인해 봅시다.

paste(dat1[2, ])
##   [1] "NA" "NA" "계" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
##  [16] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "남" "NA" "NA" "NA" "NA"
##  [31] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
##  [46] "NA" "NA" "NA" "여" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
##  [61] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "계" "NA" "NA" "NA"
##  [76] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
##  [91] "NA" "NA" "NA" "NA" "남" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [106] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "여" "NA" "NA"
## [121] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [136] "NA" "NA" "NA" "NA" "NA" "계" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [151] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "남" "NA"
## [166] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [181] "NA" "NA" "NA" "NA" "NA" "NA" "여" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [196] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
ifelse( paste(dat1[2, ]) == "NA", NA, paste(dat1[2, ]) )
##   [1] NA   NA   "계" NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  
##  [16] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   "남" NA   NA   NA   NA  
##  [31] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  
##  [46] NA   NA   NA   "여" NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  
##  [61] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   "계" NA   NA   NA  
##  [76] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  
##  [91] NA   NA   NA   NA   "남" NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  
## [106] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   "여" NA   NA  
## [121] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  
## [136] NA   NA   NA   NA   NA   "계" NA   NA   NA   NA   NA   NA   NA   NA   NA  
## [151] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   "남" NA  
## [166] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  
## [181] NA   NA   NA   NA   NA   NA   "여" NA   NA   NA   NA   NA   NA   NA   NA  
## [196] NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
table( ifelse( paste( dat1[2, ] ) == "NA", NA, paste(dat1[2, ]) ) )
## 
## 계 남 여 
##  3  3  3
names( table( ifelse( paste( dat1[2, ] ) == "NA", NA, paste(dat1[2, ]) ) ) )
## [1] "계" "남" "여"

마지막으로 각 열이 갖고 있는 열 이름(5세 단위 구분)은 다음과 같이 확인할 수 있습니다.

paste(dat1[3, -(1:2)])
##   [1] "총 인구수"      "연령구간인구수" "0~4세"          "5~9세"         
##   [5] "10~14세"        "15~19세"        "20~24세"        "25~29세"       
##   [9] "30~34세"        "35~39세"        "40~44세"        "45~49세"       
##  [13] "50~54세"        "55~59세"        "60~64세"        "65~69세"       
##  [17] "70~74세"        "75~79세"        "80~84세"        "85~89세"       
##  [21] "90~94세"        "95~99세"        "100세 이상"     "남 인구수"     
##  [25] "연령구간인구수" "0~4세"          "5~9세"          "10~14세"       
##  [29] "15~19세"        "20~24세"        "25~29세"        "30~34세"       
##  [33] "35~39세"        "40~44세"        "45~49세"        "50~54세"       
##  [37] "55~59세"        "60~64세"        "65~69세"        "70~74세"       
##  [41] "75~79세"        "80~84세"        "85~89세"        "90~94세"       
##  [45] "95~99세"        "100세 이상"     "여 인구수"      "연령구간인구수"
##  [49] "0~4세"          "5~9세"          "10~14세"        "15~19세"       
##  [53] "20~24세"        "25~29세"        "30~34세"        "35~39세"       
##  [57] "40~44세"        "45~49세"        "50~54세"        "55~59세"       
##  [61] "60~64세"        "65~69세"        "70~74세"        "75~79세"       
##  [65] "80~84세"        "85~89세"        "90~94세"        "95~99세"       
##  [69] "100세 이상"     "총 인구수"      "연령구간인구수" "0~4세"         
##  [73] "5~9세"          "10~14세"        "15~19세"        "20~24세"       
##  [77] "25~29세"        "30~34세"        "35~39세"        "40~44세"       
##  [81] "45~49세"        "50~54세"        "55~59세"        "60~64세"       
##  [85] "65~69세"        "70~74세"        "75~79세"        "80~84세"       
##  [89] "85~89세"        "90~94세"        "95~99세"        "100세 이상"    
##  [93] "총 인구수"      "연령구간인구수" "0~4세"          "5~9세"         
##  [97] "10~14세"        "15~19세"        "20~24세"        "25~29세"       
## [101] "30~34세"        "35~39세"        "40~44세"        "45~49세"       
## [105] "50~54세"        "55~59세"        "60~64세"        "65~69세"       
## [109] "70~74세"        "75~79세"        "80~84세"        "85~89세"       
## [113] "90~94세"        "95~99세"        "100세 이상"     "총 인구수"     
## [117] "연령구간인구수" "0~4세"          "5~9세"          "10~14세"       
## [121] "15~19세"        "20~24세"        "25~29세"        "30~34세"       
## [125] "35~39세"        "40~44세"        "45~49세"        "50~54세"       
## [129] "55~59세"        "60~64세"        "65~69세"        "70~74세"       
## [133] "75~79세"        "80~84세"        "85~89세"        "90~94세"       
## [137] "95~99세"        "100세 이상"     "총 인구수"      "연령구간인구수"
## [141] "0~4세"          "5~9세"          "10~14세"        "15~19세"       
## [145] "20~24세"        "25~29세"        "30~34세"        "35~39세"       
## [149] "40~44세"        "45~49세"        "50~54세"        "55~59세"       
## [153] "60~64세"        "65~69세"        "70~74세"        "75~79세"       
## [157] "80~84세"        "85~89세"        "90~94세"        "95~99세"       
## [161] "100세 이상"     "총 인구수"      "연령구간인구수" "0~4세"         
## [165] "5~9세"          "10~14세"        "15~19세"        "20~24세"       
## [169] "25~29세"        "30~34세"        "35~39세"        "40~44세"       
## [173] "45~49세"        "50~54세"        "55~59세"        "60~64세"       
## [177] "65~69세"        "70~74세"        "75~79세"        "80~84세"       
## [181] "85~89세"        "90~94세"        "95~99세"        "100세 이상"    
## [185] "총 인구수"      "연령구간인구수" "0~4세"          "5~9세"         
## [189] "10~14세"        "15~19세"        "20~24세"        "25~29세"       
## [193] "30~34세"        "35~39세"        "40~44세"        "45~49세"       
## [197] "50~54세"        "55~59세"        "60~64세"        "65~69세"       
## [201] "70~74세"        "75~79세"        "80~84세"        "85~89세"       
## [205] "90~94세"        "95~99세"        "100세 이상"

이제 최종적으로 열 이름을 세 개의 행에 걸쳐 새롭게 만들어 보면 다음과 같습니다.

  • 세번째에 있는 연령 단위가 각 열의 이름이고, 그 윗 단계인 성별 구분(계, 남, 여)이 년도별로 들어가야 한다.
    • 세번째 행의 연령 단위별 변수명은 그대로 사용한다. (변수 vars에 저장)
  • (성별)구분의 반복이 년도별 “계,….,계, 남, …, 남, 여, ….여”가 만들어지도록 하였다. (변수 grps에 저장)
    • 우선 기존에 비어 있는 열의 값은 문자열 "NA"이며 이를 결측을 나타내는 NA로 변경한다.
    • read_excel() 함수의 na인수에 “NA”를 넣어 읽어올때 결측값을 지정할 수 있다.
  • 년도값 또한 성별 구분인 계, 남, 여 별로 연령 구간만큼 존재해야 한다.
    • 필요한 년도의 갯수는 아래와 같이 구해 변수 years에 저장
  • 앞으로 이 세개의 값을 합쳐 변수명으로 사용하고자 한다.
    • "년도_구분_연령단위"로 만들어 변수 var_names에 저장하였다.
years <- names( table( ifelse( paste( dat1[1, ] ) == "NA", NA, paste(dat1[1, ]) ) ) )
grps <- names( table( ifelse( paste( dat1[2, ] ) == "NA", NA, paste(dat1[2, ]) ) ) )
vars <- paste(dat1[3, -(1:2)])

length(years)
## [1] 3
length(grps)
## [1] 3
length(vars)
## [1] 207
grps <- rep( rep( grps, each=(length(vars)/length(grps))/length(years) ), length(years) ) 
years <- rep(years, each = length(vars) / length(years))

var_names <- paste(years, grps, vars, sep="_")

데이터 다시 읽기

read_excel()함수는 원하는 행 만큼을 건너뛰고 데이터를 읽을 수 있어 다음과 같이 읽을 수 있습니다.

  • 먼저 4행의 데이터를 변수명으로 할 경우
    • 3행까지는 읽지 않고 건너뜀 : skip=3
dat <- read_excel("./data/pops/cc/200812_201012_연령별인구현황_연간.xlsx", skip=3)
## New names:
## • `총 인구수` -> `총 인구수...3`
## • `연령구간인구수` -> `연령구간인구수...4`
## • `0~4세` -> `0~4세...5`
## • `5~9세` -> `5~9세...6`
## • `10~14세` -> `10~14세...7`
## • `15~19세` -> `15~19세...8`
## • `20~24세` -> `20~24세...9`
## • `25~29세` -> `25~29세...10`
## • `30~34세` -> `30~34세...11`
## • `35~39세` -> `35~39세...12`
## • `40~44세` -> `40~44세...13`
## • `45~49세` -> `45~49세...14`
## • `50~54세` -> `50~54세...15`
## • `55~59세` -> `55~59세...16`
## • `60~64세` -> `60~64세...17`
## • `65~69세` -> `65~69세...18`
## • `70~74세` -> `70~74세...19`
## • `75~79세` -> `75~79세...20`
## • `80~84세` -> `80~84세...21`
## • `85~89세` -> `85~89세...22`
## • `90~94세` -> `90~94세...23`
## • `95~99세` -> `95~99세...24`
## • `100세 이상` -> `100세 이상...25`
## • `연령구간인구수` -> `연령구간인구수...27`
## • `0~4세` -> `0~4세...28`
## • `5~9세` -> `5~9세...29`
## • `10~14세` -> `10~14세...30`
## • `15~19세` -> `15~19세...31`
## • `20~24세` -> `20~24세...32`
## • `25~29세` -> `25~29세...33`
## • `30~34세` -> `30~34세...34`
## • `35~39세` -> `35~39세...35`
## • `40~44세` -> `40~44세...36`
## • `45~49세` -> `45~49세...37`
## • `50~54세` -> `50~54세...38`
## • `55~59세` -> `55~59세...39`
## • `60~64세` -> `60~64세...40`
## • `65~69세` -> `65~69세...41`
## • `70~74세` -> `70~74세...42`
## • `75~79세` -> `75~79세...43`
## • `80~84세` -> `80~84세...44`
## • `85~89세` -> `85~89세...45`
## • `90~94세` -> `90~94세...46`
## • `95~99세` -> `95~99세...47`
## • `100세 이상` -> `100세 이상...48`
## • `연령구간인구수` -> `연령구간인구수...50`
## • `0~4세` -> `0~4세...51`
## • `5~9세` -> `5~9세...52`
## • `10~14세` -> `10~14세...53`
## • `15~19세` -> `15~19세...54`
## • `20~24세` -> `20~24세...55`
## • `25~29세` -> `25~29세...56`
## • `30~34세` -> `30~34세...57`
## • `35~39세` -> `35~39세...58`
## • `40~44세` -> `40~44세...59`
## • `45~49세` -> `45~49세...60`
## • `50~54세` -> `50~54세...61`
## • `55~59세` -> `55~59세...62`
## • `60~64세` -> `60~64세...63`
## • `65~69세` -> `65~69세...64`
## • `70~74세` -> `70~74세...65`
## • `75~79세` -> `75~79세...66`
## • `80~84세` -> `80~84세...67`
## • `85~89세` -> `85~89세...68`
## • `90~94세` -> `90~94세...69`
## • `95~99세` -> `95~99세...70`
## • `100세 이상` -> `100세 이상...71`
## • `총 인구수` -> `총 인구수...72`
## • `연령구간인구수` -> `연령구간인구수...73`
## • `0~4세` -> `0~4세...74`
## • `5~9세` -> `5~9세...75`
## • `10~14세` -> `10~14세...76`
## • `15~19세` -> `15~19세...77`
## • `20~24세` -> `20~24세...78`
## • `25~29세` -> `25~29세...79`
## • `30~34세` -> `30~34세...80`
## • `35~39세` -> `35~39세...81`
## • `40~44세` -> `40~44세...82`
## • `45~49세` -> `45~49세...83`
## • `50~54세` -> `50~54세...84`
## • `55~59세` -> `55~59세...85`
## • `60~64세` -> `60~64세...86`
## • `65~69세` -> `65~69세...87`
## • `70~74세` -> `70~74세...88`
## • `75~79세` -> `75~79세...89`
## • `80~84세` -> `80~84세...90`
## • `85~89세` -> `85~89세...91`
## • `90~94세` -> `90~94세...92`
## • `95~99세` -> `95~99세...93`
## • `100세 이상` -> `100세 이상...94`
## • `총 인구수` -> `총 인구수...95`
## • `연령구간인구수` -> `연령구간인구수...96`
## • `0~4세` -> `0~4세...97`
## • `5~9세` -> `5~9세...98`
## • `10~14세` -> `10~14세...99`
## • `15~19세` -> `15~19세...100`
## • `20~24세` -> `20~24세...101`
## • `25~29세` -> `25~29세...102`
## • `30~34세` -> `30~34세...103`
## • `35~39세` -> `35~39세...104`
## • `40~44세` -> `40~44세...105`
## • `45~49세` -> `45~49세...106`
## • `50~54세` -> `50~54세...107`
## • `55~59세` -> `55~59세...108`
## • `60~64세` -> `60~64세...109`
## • `65~69세` -> `65~69세...110`
## • `70~74세` -> `70~74세...111`
## • `75~79세` -> `75~79세...112`
## • `80~84세` -> `80~84세...113`
## • `85~89세` -> `85~89세...114`
## • `90~94세` -> `90~94세...115`
## • `95~99세` -> `95~99세...116`
## • `100세 이상` -> `100세 이상...117`
## • `총 인구수` -> `총 인구수...118`
## • `연령구간인구수` -> `연령구간인구수...119`
## • `0~4세` -> `0~4세...120`
## • `5~9세` -> `5~9세...121`
## • `10~14세` -> `10~14세...122`
## • `15~19세` -> `15~19세...123`
## • `20~24세` -> `20~24세...124`
## • `25~29세` -> `25~29세...125`
## • `30~34세` -> `30~34세...126`
## • `35~39세` -> `35~39세...127`
## • `40~44세` -> `40~44세...128`
## • `45~49세` -> `45~49세...129`
## • `50~54세` -> `50~54세...130`
## • `55~59세` -> `55~59세...131`
## • `60~64세` -> `60~64세...132`
## • `65~69세` -> `65~69세...133`
## • `70~74세` -> `70~74세...134`
## • `75~79세` -> `75~79세...135`
## • `80~84세` -> `80~84세...136`
## • `85~89세` -> `85~89세...137`
## • `90~94세` -> `90~94세...138`
## • `95~99세` -> `95~99세...139`
## • `100세 이상` -> `100세 이상...140`
## • `총 인구수` -> `총 인구수...141`
## • `연령구간인구수` -> `연령구간인구수...142`
## • `0~4세` -> `0~4세...143`
## • `5~9세` -> `5~9세...144`
## • `10~14세` -> `10~14세...145`
## • `15~19세` -> `15~19세...146`
## • `20~24세` -> `20~24세...147`
## • `25~29세` -> `25~29세...148`
## • `30~34세` -> `30~34세...149`
## • `35~39세` -> `35~39세...150`
## • `40~44세` -> `40~44세...151`
## • `45~49세` -> `45~49세...152`
## • `50~54세` -> `50~54세...153`
## • `55~59세` -> `55~59세...154`
## • `60~64세` -> `60~64세...155`
## • `65~69세` -> `65~69세...156`
## • `70~74세` -> `70~74세...157`
## • `75~79세` -> `75~79세...158`
## • `80~84세` -> `80~84세...159`
## • `85~89세` -> `85~89세...160`
## • `90~94세` -> `90~94세...161`
## • `95~99세` -> `95~99세...162`
## • `100세 이상` -> `100세 이상...163`
## • `총 인구수` -> `총 인구수...164`
## • `연령구간인구수` -> `연령구간인구수...165`
## • `0~4세` -> `0~4세...166`
## • `5~9세` -> `5~9세...167`
## • `10~14세` -> `10~14세...168`
## • `15~19세` -> `15~19세...169`
## • `20~24세` -> `20~24세...170`
## • `25~29세` -> `25~29세...171`
## • `30~34세` -> `30~34세...172`
## • `35~39세` -> `35~39세...173`
## • `40~44세` -> `40~44세...174`
## • `45~49세` -> `45~49세...175`
## • `50~54세` -> `50~54세...176`
## • `55~59세` -> `55~59세...177`
## • `60~64세` -> `60~64세...178`
## • `65~69세` -> `65~69세...179`
## • `70~74세` -> `70~74세...180`
## • `75~79세` -> `75~79세...181`
## • `80~84세` -> `80~84세...182`
## • `85~89세` -> `85~89세...183`
## • `90~94세` -> `90~94세...184`
## • `95~99세` -> `95~99세...185`
## • `100세 이상` -> `100세 이상...186`
## • `총 인구수` -> `총 인구수...187`
## • `연령구간인구수` -> `연령구간인구수...188`
## • `0~4세` -> `0~4세...189`
## • `5~9세` -> `5~9세...190`
## • `10~14세` -> `10~14세...191`
## • `15~19세` -> `15~19세...192`
## • `20~24세` -> `20~24세...193`
## • `25~29세` -> `25~29세...194`
## • `30~34세` -> `30~34세...195`
## • `35~39세` -> `35~39세...196`
## • `40~44세` -> `40~44세...197`
## • `45~49세` -> `45~49세...198`
## • `50~54세` -> `50~54세...199`
## • `55~59세` -> `55~59세...200`
## • `60~64세` -> `60~64세...201`
## • `65~69세` -> `65~69세...202`
## • `70~74세` -> `70~74세...203`
## • `75~79세` -> `75~79세...204`
## • `80~84세` -> `80~84세...205`
## • `85~89세` -> `85~89세...206`
## • `90~94세` -> `90~94세...207`
## • `95~99세` -> `95~99세...208`
## • `100세 이상` -> `100세 이상...209`
dat
## # A tibble: 26 × 209
##    행정기관코드 행정기관          `총 인구수...3` 연령구간인구수...4 `0~4세...5`
##    <chr>        <chr>                       <dbl>              <dbl>       <dbl>
##  1 4211000000   강원도 춘천시              261975             261975       11381
##  2 4211025000   강원도 춘천시 신…            7531               7531         264
##  3 4211031000   강원도 춘천시 동…            6025               6025         284
##  4 4211032000   강원도 춘천시 동…            1613               1613          38
##  5 4211033000   강원도 춘천시 신…            2603               2603          58
##  6 4211034000   강원도 춘천시 남…            1130               1130          27
##  7 4211035000   강원도 춘천시 서…            4151               4151         109
##  8 4211036000   강원도 춘천시 사…            2600               2600          55
##  9 4211038000   강원도 춘천시 북…             886                886          10
## 10 4211039000   강원도 춘천시 동…           10585              10585         642
## # ℹ 16 more rows
## # ℹ 204 more variables: `5~9세...6` <dbl>, `10~14세...7` <dbl>,
## #   `15~19세...8` <dbl>, `20~24세...9` <dbl>, `25~29세...10` <dbl>,
## #   `30~34세...11` <dbl>, `35~39세...12` <dbl>, `40~44세...13` <dbl>,
## #   `45~49세...14` <dbl>, `50~54세...15` <dbl>, `55~59세...16` <dbl>,
## #   `60~64세...17` <dbl>, `65~69세...18` <dbl>, `70~74세...19` <dbl>,
## #   `75~79세...20` <dbl>, `80~84세...21` <dbl>, `85~89세...22` <dbl>, …
  • 만일 변수명을 데이터로부터 읽지 않으려면 다음처럼 지정합니다.
    • 4행까지 건너뛰고 : skip=4
    • 변수명 읽는 행 없이 바로 데이터로 읽기 : col_names=FALSE
dat <- read_excel("./data/pops/cc/200812_201012_연령별인구현황_연간.xlsx", skip=4, col_names=FALSE)
## New names:
## • `` -> `...1`
## • `` -> `...2`
## • `` -> `...3`
## • `` -> `...4`
## • `` -> `...5`
## • `` -> `...6`
## • `` -> `...7`
## • `` -> `...8`
## • `` -> `...9`
## • `` -> `...10`
## • `` -> `...11`
## • `` -> `...12`
## • `` -> `...13`
## • `` -> `...14`
## • `` -> `...15`
## • `` -> `...16`
## • `` -> `...17`
## • `` -> `...18`
## • `` -> `...19`
## • `` -> `...20`
## • `` -> `...21`
## • `` -> `...22`
## • `` -> `...23`
## • `` -> `...24`
## • `` -> `...25`
## • `` -> `...26`
## • `` -> `...27`
## • `` -> `...28`
## • `` -> `...29`
## • `` -> `...30`
## • `` -> `...31`
## • `` -> `...32`
## • `` -> `...33`
## • `` -> `...34`
## • `` -> `...35`
## • `` -> `...36`
## • `` -> `...37`
## • `` -> `...38`
## • `` -> `...39`
## • `` -> `...40`
## • `` -> `...41`
## • `` -> `...42`
## • `` -> `...43`
## • `` -> `...44`
## • `` -> `...45`
## • `` -> `...46`
## • `` -> `...47`
## • `` -> `...48`
## • `` -> `...49`
## • `` -> `...50`
## • `` -> `...51`
## • `` -> `...52`
## • `` -> `...53`
## • `` -> `...54`
## • `` -> `...55`
## • `` -> `...56`
## • `` -> `...57`
## • `` -> `...58`
## • `` -> `...59`
## • `` -> `...60`
## • `` -> `...61`
## • `` -> `...62`
## • `` -> `...63`
## • `` -> `...64`
## • `` -> `...65`
## • `` -> `...66`
## • `` -> `...67`
## • `` -> `...68`
## • `` -> `...69`
## • `` -> `...70`
## • `` -> `...71`
## • `` -> `...72`
## • `` -> `...73`
## • `` -> `...74`
## • `` -> `...75`
## • `` -> `...76`
## • `` -> `...77`
## • `` -> `...78`
## • `` -> `...79`
## • `` -> `...80`
## • `` -> `...81`
## • `` -> `...82`
## • `` -> `...83`
## • `` -> `...84`
## • `` -> `...85`
## • `` -> `...86`
## • `` -> `...87`
## • `` -> `...88`
## • `` -> `...89`
## • `` -> `...90`
## • `` -> `...91`
## • `` -> `...92`
## • `` -> `...93`
## • `` -> `...94`
## • `` -> `...95`
## • `` -> `...96`
## • `` -> `...97`
## • `` -> `...98`
## • `` -> `...99`
## • `` -> `...100`
## • `` -> `...101`
## • `` -> `...102`
## • `` -> `...103`
## • `` -> `...104`
## • `` -> `...105`
## • `` -> `...106`
## • `` -> `...107`
## • `` -> `...108`
## • `` -> `...109`
## • `` -> `...110`
## • `` -> `...111`
## • `` -> `...112`
## • `` -> `...113`
## • `` -> `...114`
## • `` -> `...115`
## • `` -> `...116`
## • `` -> `...117`
## • `` -> `...118`
## • `` -> `...119`
## • `` -> `...120`
## • `` -> `...121`
## • `` -> `...122`
## • `` -> `...123`
## • `` -> `...124`
## • `` -> `...125`
## • `` -> `...126`
## • `` -> `...127`
## • `` -> `...128`
## • `` -> `...129`
## • `` -> `...130`
## • `` -> `...131`
## • `` -> `...132`
## • `` -> `...133`
## • `` -> `...134`
## • `` -> `...135`
## • `` -> `...136`
## • `` -> `...137`
## • `` -> `...138`
## • `` -> `...139`
## • `` -> `...140`
## • `` -> `...141`
## • `` -> `...142`
## • `` -> `...143`
## • `` -> `...144`
## • `` -> `...145`
## • `` -> `...146`
## • `` -> `...147`
## • `` -> `...148`
## • `` -> `...149`
## • `` -> `...150`
## • `` -> `...151`
## • `` -> `...152`
## • `` -> `...153`
## • `` -> `...154`
## • `` -> `...155`
## • `` -> `...156`
## • `` -> `...157`
## • `` -> `...158`
## • `` -> `...159`
## • `` -> `...160`
## • `` -> `...161`
## • `` -> `...162`
## • `` -> `...163`
## • `` -> `...164`
## • `` -> `...165`
## • `` -> `...166`
## • `` -> `...167`
## • `` -> `...168`
## • `` -> `...169`
## • `` -> `...170`
## • `` -> `...171`
## • `` -> `...172`
## • `` -> `...173`
## • `` -> `...174`
## • `` -> `...175`
## • `` -> `...176`
## • `` -> `...177`
## • `` -> `...178`
## • `` -> `...179`
## • `` -> `...180`
## • `` -> `...181`
## • `` -> `...182`
## • `` -> `...183`
## • `` -> `...184`
## • `` -> `...185`
## • `` -> `...186`
## • `` -> `...187`
## • `` -> `...188`
## • `` -> `...189`
## • `` -> `...190`
## • `` -> `...191`
## • `` -> `...192`
## • `` -> `...193`
## • `` -> `...194`
## • `` -> `...195`
## • `` -> `...196`
## • `` -> `...197`
## • `` -> `...198`
## • `` -> `...199`
## • `` -> `...200`
## • `` -> `...201`
## • `` -> `...202`
## • `` -> `...203`
## • `` -> `...204`
## • `` -> `...205`
## • `` -> `...206`
## • `` -> `...207`
## • `` -> `...208`
## • `` -> `...209`
dat
## # A tibble: 26 × 209
##    ...1      ...2    ...3   ...4  ...5  ...6  ...7  ...8  ...9 ...10 ...11 ...12
##    <chr>     <chr>  <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1 42110000… 강원… 261975 261975 11381 15326 18927 18260 17214 19038 17812 22623
##  2 42110250… 강원…   7531   7531   264   289   353   433   459   481   462   500
##  3 42110310… 강원…   6025   6025   284   331   333   375   376   381   372   483
##  4 42110320… 강원…   1613   1613    38    48    58    74   110    87    55    80
##  5 42110330… 강원…   2603   2603    58    76   135   163   193   158   112   156
##  6 42110340… 강원…   1130   1130    27    22    25    38    53    61    43    53
##  7 42110350… 강원…   4151   4151   109   127   155   229   219   216   173   193
##  8 42110360… 강원…   2600   2600    55    90   117   146   148   128    85   129
##  9 42110380… 강원…    886    886    10    14    26    50    35    27    25    38
## 10 42110390… 강원…  10585  10585   642   670   714   620   589   788   882  1018
## # ℹ 16 more rows
## # ℹ 197 more variables: ...13 <dbl>, ...14 <dbl>, ...15 <dbl>, ...16 <dbl>,
## #   ...17 <dbl>, ...18 <dbl>, ...19 <dbl>, ...20 <dbl>, ...21 <dbl>,
## #   ...22 <dbl>, ...23 <dbl>, ...24 <dbl>, ...25 <dbl>, ...26 <dbl>,
## #   ...27 <dbl>, ...28 <dbl>, ...29 <dbl>, ...30 <dbl>, ...31 <dbl>,
## #   ...32 <dbl>, ...33 <dbl>, ...34 <dbl>, ...35 <dbl>, ...36 <dbl>,
## #   ...37 <dbl>, ...38 <dbl>, ...39 <dbl>, ...40 <dbl>, ...41 <dbl>, …

변수명 재정의하기

앞서 만든 변수명은 처음 두 열의 이름(행정기관 코드와 읍면동 이름)이 빠져 있어 다음과 같이 두 열의 이름을 추가하여 정의합시다.

names( dat ) <- c( "code", "region", var_names )
names( dat )
##   [1] "code"                     "region"                  
##   [3] "2008년_계_총 인구수"      "2008년_계_연령구간인구수"
##   [5] "2008년_계_0~4세"          "2008년_계_5~9세"         
##   [7] "2008년_계_10~14세"        "2008년_계_15~19세"       
##   [9] "2008년_계_20~24세"        "2008년_계_25~29세"       
##  [11] "2008년_계_30~34세"        "2008년_계_35~39세"       
##  [13] "2008년_계_40~44세"        "2008년_계_45~49세"       
##  [15] "2008년_계_50~54세"        "2008년_계_55~59세"       
##  [17] "2008년_계_60~64세"        "2008년_계_65~69세"       
##  [19] "2008년_계_70~74세"        "2008년_계_75~79세"       
##  [21] "2008년_계_80~84세"        "2008년_계_85~89세"       
##  [23] "2008년_계_90~94세"        "2008년_계_95~99세"       
##  [25] "2008년_계_100세 이상"     "2008년_남_남 인구수"     
##  [27] "2008년_남_연령구간인구수" "2008년_남_0~4세"         
##  [29] "2008년_남_5~9세"          "2008년_남_10~14세"       
##  [31] "2008년_남_15~19세"        "2008년_남_20~24세"       
##  [33] "2008년_남_25~29세"        "2008년_남_30~34세"       
##  [35] "2008년_남_35~39세"        "2008년_남_40~44세"       
##  [37] "2008년_남_45~49세"        "2008년_남_50~54세"       
##  [39] "2008년_남_55~59세"        "2008년_남_60~64세"       
##  [41] "2008년_남_65~69세"        "2008년_남_70~74세"       
##  [43] "2008년_남_75~79세"        "2008년_남_80~84세"       
##  [45] "2008년_남_85~89세"        "2008년_남_90~94세"       
##  [47] "2008년_남_95~99세"        "2008년_남_100세 이상"    
##  [49] "2008년_여_여 인구수"      "2008년_여_연령구간인구수"
##  [51] "2008년_여_0~4세"          "2008년_여_5~9세"         
##  [53] "2008년_여_10~14세"        "2008년_여_15~19세"       
##  [55] "2008년_여_20~24세"        "2008년_여_25~29세"       
##  [57] "2008년_여_30~34세"        "2008년_여_35~39세"       
##  [59] "2008년_여_40~44세"        "2008년_여_45~49세"       
##  [61] "2008년_여_50~54세"        "2008년_여_55~59세"       
##  [63] "2008년_여_60~64세"        "2008년_여_65~69세"       
##  [65] "2008년_여_70~74세"        "2008년_여_75~79세"       
##  [67] "2008년_여_80~84세"        "2008년_여_85~89세"       
##  [69] "2008년_여_90~94세"        "2008년_여_95~99세"       
##  [71] "2008년_여_100세 이상"     "2009년_계_총 인구수"     
##  [73] "2009년_계_연령구간인구수" "2009년_계_0~4세"         
##  [75] "2009년_계_5~9세"          "2009년_계_10~14세"       
##  [77] "2009년_계_15~19세"        "2009년_계_20~24세"       
##  [79] "2009년_계_25~29세"        "2009년_계_30~34세"       
##  [81] "2009년_계_35~39세"        "2009년_계_40~44세"       
##  [83] "2009년_계_45~49세"        "2009년_계_50~54세"       
##  [85] "2009년_계_55~59세"        "2009년_계_60~64세"       
##  [87] "2009년_계_65~69세"        "2009년_계_70~74세"       
##  [89] "2009년_계_75~79세"        "2009년_계_80~84세"       
##  [91] "2009년_계_85~89세"        "2009년_계_90~94세"       
##  [93] "2009년_계_95~99세"        "2009년_계_100세 이상"    
##  [95] "2009년_남_총 인구수"      "2009년_남_연령구간인구수"
##  [97] "2009년_남_0~4세"          "2009년_남_5~9세"         
##  [99] "2009년_남_10~14세"        "2009년_남_15~19세"       
## [101] "2009년_남_20~24세"        "2009년_남_25~29세"       
## [103] "2009년_남_30~34세"        "2009년_남_35~39세"       
## [105] "2009년_남_40~44세"        "2009년_남_45~49세"       
## [107] "2009년_남_50~54세"        "2009년_남_55~59세"       
## [109] "2009년_남_60~64세"        "2009년_남_65~69세"       
## [111] "2009년_남_70~74세"        "2009년_남_75~79세"       
## [113] "2009년_남_80~84세"        "2009년_남_85~89세"       
## [115] "2009년_남_90~94세"        "2009년_남_95~99세"       
## [117] "2009년_남_100세 이상"     "2009년_여_총 인구수"     
## [119] "2009년_여_연령구간인구수" "2009년_여_0~4세"         
## [121] "2009년_여_5~9세"          "2009년_여_10~14세"       
## [123] "2009년_여_15~19세"        "2009년_여_20~24세"       
## [125] "2009년_여_25~29세"        "2009년_여_30~34세"       
## [127] "2009년_여_35~39세"        "2009년_여_40~44세"       
## [129] "2009년_여_45~49세"        "2009년_여_50~54세"       
## [131] "2009년_여_55~59세"        "2009년_여_60~64세"       
## [133] "2009년_여_65~69세"        "2009년_여_70~74세"       
## [135] "2009년_여_75~79세"        "2009년_여_80~84세"       
## [137] "2009년_여_85~89세"        "2009년_여_90~94세"       
## [139] "2009년_여_95~99세"        "2009년_여_100세 이상"    
## [141] "2010년_계_총 인구수"      "2010년_계_연령구간인구수"
## [143] "2010년_계_0~4세"          "2010년_계_5~9세"         
## [145] "2010년_계_10~14세"        "2010년_계_15~19세"       
## [147] "2010년_계_20~24세"        "2010년_계_25~29세"       
## [149] "2010년_계_30~34세"        "2010년_계_35~39세"       
## [151] "2010년_계_40~44세"        "2010년_계_45~49세"       
## [153] "2010년_계_50~54세"        "2010년_계_55~59세"       
## [155] "2010년_계_60~64세"        "2010년_계_65~69세"       
## [157] "2010년_계_70~74세"        "2010년_계_75~79세"       
## [159] "2010년_계_80~84세"        "2010년_계_85~89세"       
## [161] "2010년_계_90~94세"        "2010년_계_95~99세"       
## [163] "2010년_계_100세 이상"     "2010년_남_총 인구수"     
## [165] "2010년_남_연령구간인구수" "2010년_남_0~4세"         
## [167] "2010년_남_5~9세"          "2010년_남_10~14세"       
## [169] "2010년_남_15~19세"        "2010년_남_20~24세"       
## [171] "2010년_남_25~29세"        "2010년_남_30~34세"       
## [173] "2010년_남_35~39세"        "2010년_남_40~44세"       
## [175] "2010년_남_45~49세"        "2010년_남_50~54세"       
## [177] "2010년_남_55~59세"        "2010년_남_60~64세"       
## [179] "2010년_남_65~69세"        "2010년_남_70~74세"       
## [181] "2010년_남_75~79세"        "2010년_남_80~84세"       
## [183] "2010년_남_85~89세"        "2010년_남_90~94세"       
## [185] "2010년_남_95~99세"        "2010년_남_100세 이상"    
## [187] "2010년_여_총 인구수"      "2010년_여_연령구간인구수"
## [189] "2010년_여_0~4세"          "2010년_여_5~9세"         
## [191] "2010년_여_10~14세"        "2010년_여_15~19세"       
## [193] "2010년_여_20~24세"        "2010년_여_25~29세"       
## [195] "2010년_여_30~34세"        "2010년_여_35~39세"       
## [197] "2010년_여_40~44세"        "2010년_여_45~49세"       
## [199] "2010년_여_50~54세"        "2010년_여_55~59세"       
## [201] "2010년_여_60~64세"        "2010년_여_65~69세"       
## [203] "2010년_여_70~74세"        "2010년_여_75~79세"       
## [205] "2010년_여_80~84세"        "2010년_여_85~89세"       
## [207] "2010년_여_90~94세"        "2010년_여_95~99세"       
## [209] "2010년_여_100세 이상"

tidy 데이터로 변환하기기

wide2long

tidyverse 패키지 (내의 tidyr 패키지)에서 제공하는 함수 pivot_long()는 wide format 데이터를 long format 데이터로 변환하는 기능을 한다. 이 함수를 이용하여 위의 데이터를 long format 데이터로 변환하겠습니다.1

pivot_longer()함수의 주요 인수는 다음과 같습니다.

  • 첫번째 인수 : 데이터 (여기서는 %>%으로 전달)
  • 두번째 인수 : (해당 데이터에서 long format으로) 변환할 열
  • names_to 인수 : 변환후 기존 열 이름을 값으로 하는 열 이름
  • values_to 인수 : 변환후 기존 값이 저장될 열 이름
dat %>%
  pivot_longer(-(1:2), names_to="age_grp", values_to="pops")
## # A tibble: 5,382 × 4
##    code       region        age_grp                    pops
##    <chr>      <chr>         <chr>                     <dbl>
##  1 4211000000 강원도 춘천시 2008년_계_총 인구수      261975
##  2 4211000000 강원도 춘천시 2008년_계_연령구간인구수 261975
##  3 4211000000 강원도 춘천시 2008년_계_0~4세           11381
##  4 4211000000 강원도 춘천시 2008년_계_5~9세           15326
##  5 4211000000 강원도 춘천시 2008년_계_10~14세         18927
##  6 4211000000 강원도 춘천시 2008년_계_15~19세         18260
##  7 4211000000 강원도 춘천시 2008년_계_20~24세         17214
##  8 4211000000 강원도 춘천시 2008년_계_25~29세         19038
##  9 4211000000 강원도 춘천시 2008년_계_30~34세         17812
## 10 4211000000 강원도 춘천시 2008년_계_35~39세         22623
## # ℹ 5,372 more rows

필요한 열 생성하기

마지막으로 위에서 생성한 age_grp열의 값을 separate() 함수를 이용하여 밑줄문자(_, underscore)를 분리자로 기존 열의 값을 분리하고 into 인수로 지정한 각 열에 배치합니다.

dat %>%
  pivot_longer(-(1:2), names_to="age_grp", values_to="pops") %>%
  separate(age_grp, into=c("year", "grp", "age_grp"), sep="_")
## # A tibble: 5,382 × 6
##    code       region        year   grp   age_grp          pops
##    <chr>      <chr>         <chr>  <chr> <chr>           <dbl>
##  1 4211000000 강원도 춘천시 2008년 계    총 인구수      261975
##  2 4211000000 강원도 춘천시 2008년 계    연령구간인구수 261975
##  3 4211000000 강원도 춘천시 2008년 계    0~4세           11381
##  4 4211000000 강원도 춘천시 2008년 계    5~9세           15326
##  5 4211000000 강원도 춘천시 2008년 계    10~14세         18927
##  6 4211000000 강원도 춘천시 2008년 계    15~19세         18260
##  7 4211000000 강원도 춘천시 2008년 계    20~24세         17214
##  8 4211000000 강원도 춘천시 2008년 계    25~29세         19038
##  9 4211000000 강원도 춘천시 2008년 계    30~34세         17812
## 10 4211000000 강원도 춘천시 2008년 계    35~39세         22623
## # ℹ 5,372 more rows

  1. 기존에 gather()함수를 이용한 변환을 2021년 1월 31일에 tidyr 패키지의 pivot_longer() 함수를 이용하는 것으로 수정하였습니다. 이는 tidyverse 패키지에서 gather()의 사용단계가 retired로 전환하였기 때문입니다.↩︎

R - 활용data preparationExcel읽기Rtidy데이터 전처리

R에서 날짜와 시간