表形式のデータを1列1データの形式に変換する
データ↓
https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&cycle=0&toukei=00200524&tstat=000000090001&tclass1=000000090004&tclass2=000000090005&tclass3val=0&stat_infid=000000090266
xlsxファイルの状態で確認すると,データフレーム型で渡しにくい表になっている.9行目を10行目にコピーして,1-9行目を削除する
(1920-21年の上の部分だけ抜粋)
Prefectures |
Male |
Female |
Sex ratio |
Male |
Female |
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 |
Iwate-ken |
421 |
424 |
99.2 |
426 |
429.3 |
99.2 |
方針
- データ部分は3列ずつ取って下にくっつける
- flag(年,都道府県)は,データ部分に後から紐つける
1. データの読み込み
今回は行列型でデータを読み込む
library(tidyr)
library(dplyr)
getwd() #ソースファイルと同じディレクトリにない場合はsetwd()
rm(list=ls()) #環境に残っているデータを綺麗にする
#データを読み込む wdがあっているか注意する
df <- read.csv("rowdata_都道府県別人口推移.csv") #今回はこのファイル名
m <- as.matrix(df[,-1])
head(m) #最初の数行を確認
summary(m)
summaryの結果を確認
元データにカンマが入っていたので,数値データもchar型になっている
> summary(m)
Prefectures Male Female Sex.ratio Male.1
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
2. データを縦に並べる
使う関数:
for(), rbind() 行を組み合わせていく, length() 個数を確認する
#1920-2000年のデータを縦に並べる
#初期値
x <- 5
y <- 7
m2 <- m[,2:4] #1920年の分のみ入っている
for(i in 1:80){
m2 <- rbind(m2,m[,x:y])
x <- x+3
y <- y+3
}
length(m2[,1])
48*81 #個数一致確認
個数の一致確認の結果より,3列単位のデータが並べられた
> length(m2[,1])
[1] 3888
> 48*81 #48 = 47都道府県+全国 81 = 2000年 - 1919年
[1] 3888
3. flag部分のベクトル作成
#縦に並べるyearをベクトルで作る
year <- c()
z <- 1920
for(i in 1:81){
for(k in 1:48){
year <- c(year,z)
}
z <- z+1
}
#縦に繰り返し渡す都道府県名をベクトルで持つ
prefectures <- m[,1]
prefectures2 <- c()
for(i in 1:81){
prefectures2 <- c(prefectures2,prefectures)
}
length(prefectures2)
4. データの結合
使う関数:colnames() headerのベクトルをとる時に使用する
m3 <- cbind(year,prefectures2,m2)
df_final <- as.data.frame(m3)
head(df_final)
colnames(df_final) <- c("year","pref","Male","Female","Sexratio")
head(df_final)
summary(df_final)
結果の確認
データは縦に並んでいるが,char 型
> head(df_final)
year pref Male Female Sexratio
1 1920 Japan 28,044 27,919 100.4
2 1920 Hokkaido 1,244 1,115 111.6
3 1920 Aomori-ken 381 375 101.6
4 1920 Iwate-ken 421 424 99.2
5 1920 Miyagi-ken 485 476 101.9
6 1920 Akita-ken 454 445 102.0
> summary(df_final)
year pref Male Female Sexratio
Length:3888 Length:3888 Length:3888 Length:3888 Length:3888
Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character
5. データ中のカンマを排除して数値型に変換 NAの処理も行う
使う関数:sub() 文字を置換するときに使う lapply() データフレーム中の指定した列の型を一括で変更する na.omit() NAを含む列ごと削除できる
#今回はMaleとFemaleそれぞれでfor文を作る 特に意味はない
#Male
x <- 1
for(i in 1:3888){
df_final$Male[x] <- sub(",","",df$Male[x])
x <- x+1
}
#Female
x <- 1
for(i in 1:3888){
df_final$Female[x] <- sub(",","",df$Female[x])
x <- x+1
}
var <- c("Male","Female","Sexratio")
df_final[,var] <- lapply(df[,var], as.numeric)
df_final <- na.omit(df)
これで,データを作成できた.ただ,コードが長くなってしまったので,
pivot_longer関数を使った表データ→列データ変換を行う