データの前処理#1の続き
Rを用いて表データを列データに変換する
今回は主にpivot_longer関数を使用する
現状:表は縦方向に都道府県名,横方向に年月かつ性別となっているので,横方向にflagが2つ入っている状態
対応:年月+性別をひとつのみなし,最後に分割する
備考:今回はデータを加工できるのかを確かめることが主目的なので,1920-1923年のデータで行う(1945年以降の沖縄のデータが穴抜けなので処理が増えるのを避ける)
1. csvファイルに対して前処理を行う
列名はexcelで = 年&”_”&性別 を使って処理
(上の部分だけ抜粋する)
Prefectures | 1920_Male | 1920_Female | 1920_Sex ratio | 1921_Male | 1921_Female | 1921_Sex ratio |
---|---|---|---|---|---|---|
Japan | 28,044 | 27,919 | 100.4 | 28,411.70 | 28,254.20 | 100.6 |
Hokkaido | 1,244 | 1,115 | 111.6 | 1,255.60 | 1,130.30 | 111.1 |
Aomori-ken | 381 | 375 | 101.6 | 386.4 | 381 | 101.4 |
2. データの読み込み
library(tidyr) library(dplyr) rm(list=ls()) setwd() #生データと同じフォルダ df <- read.csv("rowdata_都道府県別人口推移.csv") df <- df[,1:13] #1920-1923年まで #カンマの排除################### k <- 1 l <- 1 for(k in 1:13){ for(l in 1:48){ df[l,k] <- sub(",","",df[l,k]) l <- l+1 } k <- k+1 } summary(df) #################################
結果
> summary(df) Prefectures X1920_Male X1920_Female X1920_Sex.ratio X1921_Male Length:48 Length:48 Length:48 Length:48 Length:48 Class :character Class :character Class :character Class :character Class :character Mode :character Mode :character Mode :character Mode :character Mode :character X1921_Female X1921_Sex.ratio X1922_Male X1922_Female X1922_Sex.ratio Length:48 Length:48 Length:48 Length:48 Length:48 Class :character Class :character Class :character Class :character Class :character Mode :character Mode :character Mode :character Mode :character Mode :character X1923_Male X1923_Female X1923_Sex.ratio Length:48 Length:48 Length:48 Class :character Class :character Class :character Mode :character Mode :character Mode :character
3. データの型変換
ver <- df %>% names() %>% print() ver <- ver[-1] %>% print() df[,ver] <- lapply(df[,ver],as.numeric) summary(df)
全て数値型に変換完了
> summary(df) Prefectures X1920_Male X1920_Female X1920_Sex.ratio X1921_Male Length:48 Min. : 223 Min. : 232.0 Min. : 92.60 Min. : 224.9 Class :character 1st Qu.: 355 1st Qu.: 367.5 1st Qu.: 96.17 1st Qu.: 355.4 Mode :character Median : 518 Median : 533.0 Median : 98.15 Median : 522.0 Mean : 1168 Mean : 1163.2 Mean : 99.15 Mean : 1183.8 3rd Qu.: 684 3rd Qu.: 700.0 3rd Qu.:100.80 3rd Qu.: 693.9 Max. :28044 Max. :27919.0 Max. :111.80 Max. :28411.7 X1921_Female X1921_Sex.ratio X1922_Male X1922_Female X1922_Sex.ratio Min. : 234.5 Min. : 92.60 Min. : 226.4 Min. : 236.4 Min. : 92.60 1st Qu.: 367.4 1st Qu.: 96.38 1st Qu.: 356.3 1st Qu.: 366.6 1st Qu.: 96.47 Median : 538.5 Median : 98.20 Median : 525.6 Median : 542.6 Median : 98.55 Mean : 1177.3 Mean : 99.24 Mean : 1200.0 Mean : 1191.3 Mean : 99.38 3rd Qu.: 708.6 3rd Qu.:101.00 3rd Qu.: 701.1 3rd Qu.: 711.5 3rd Qu.:101.12 Max. :28254.2 Max. :112.00 Max. :28799.7 Max. :28590.3 Max. :112.70 X1923_Male X1923_Female X1923_Sex.ratio Min. : 228.2 Min. : 238.4 Min. : 92.70 1st Qu.: 360.3 1st Qu.: 369.7 1st Qu.: 96.72 Median : 536.1 Median : 552.2 Median : 98.65 Mean : 1215.7 Mean : 1205.9 Mean : 99.50 3rd Qu.: 702.4 3rd Qu.: 723.9 3rd Qu.:101.62 Max. :29176.9 Max. :28942.3 Max. :112.70
4. pivot_longerを用いた表→列データ変換
nameにはまずはyear_sexで入れて,後から,”_”での列の分割を行う
使う関数:pivot_longer(), separate()
備考:cols = データのある列を指定 name_to = flag名 name_prefixed = 先頭についてしまっているXを無視する
df2 <- df %>% pivot_longer( cols = -Prefectures, names_to = c("year_Sex"), names_prefix = "X" ) df2 <- df2 %>% separate(year_Sex,c("year","sex"), sep="_") df2$year <- as.numeric(df2$year) head(df2)
結果
> head(df2) # A tibble: 6 × 4 Prefectures year sex value <chr> <dbl> <chr> <dbl> 1 Japan 1920 Male 28044 2 Japan 1920 Female 27919 3 Japan 1920 Sex.ratio 100. 4 Japan 1921 Male 28412. 5 Japan 1921 Female 28254. 6 Japan 1921 Sex.ratio 101.
左3列のフラグに対する人口を対応させることができた
このデータの状態で散布図にplotする