「素の R で,データスクレイピングとプロット(その1)」で使用した Excel ファイルは *.xls 形式で,かつ 3 段組みの表になっており処理がちょっと面倒であった。
これとは別の,市区町村別の生命表のエクセルファイルが同じく政府統計ポータルサイトからダウンロードできる。
https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031693271&fileKind=0
ダウンロードしたファイルは,ckts-lifetable2015.xlsxである。
拡張子が .xlsx なので,openxlsx パッケージで入力できるので,readlx::read_excel よりストレスフリーである。
この Excel ファイルはしっかりとしたひな形にしたがって作成されているので,プログラムで例外処理をさせることなく,簡単に必要なデータを取り出せる。
「素の R で,データスクレイピングとプロット(その1)」で示したプログラムより遙かに短くて済む。
# https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031693271&fileKind=0
# 図表データのダウンロード
# ファイル名: ckts-lifetable2015.xlsx
# 生命表1〜生命表7 が該当
# 7 列目が「平均余命」の 1 行前の 2 列目が「都道府県名+市区町村名」
# 3,25 行目先の 7 列目が目的値(男,女)
# install.packages("openxlsx")
library(openxlsx)
# 文字列を数値化。数値以外の場合はメッセージを出力し NA を返す。
get_value = function(txt, str) {
if (grepl("[^0-9.]", str)) {
cat("非数値データ:", txt, "\n", str, "を NA に変換\n")
return(NA)
}
return(as.numeric(str))
}
seireisi = c("札幌市", "仙台市", "さいたま市", "千葉市", "東京都区部",
"横浜市", "川崎市", "相模原市", "新潟市", "静岡市", "浜松市",
"名古屋市", "京都市", "大阪市", "堺市", "神戸市", "岡山市",
"広島市", "北九州市", "福岡市", "熊本市")
con = file("all3.csv", "w") # 結果の出力ファイル
count = 0
for (page in 1:7) { # 生命表1〜生命表7
data = read.xlsx("ckts-lifetable2015.xlsx", sheet = page + 1)
for (i in 1:nrow(data)) {
if (!is.na(data[i, 7]) && data[i, 7] == "平均余命") {
str1 = data[i - 1, 2] # 自治体名
str2 = data[i + 3, 7] # 男
str3 = data[i + 25, 7] # 女
name = unlist(strsplit(str1, " "))
if (length(name) == 1 || length(name) == 2 && name[2] %in% seireisi) {
cat("除外:", str1, "\n") # 除外した自治体名を表示
} else {
count = count + 1
cat(c(str1, get_value(str1, str2), get_value(str1, str3), "\n"),
file = con, append = TRUE)
}
}
}
}
close(con)
cat(count, "件") # 1896 件