e-Statの邪智暴虐っぷりに打ちのめされていた私ですが、uri氏がやってくれました。
原作を引用して言えば
「メロス、私を殴れ。同じくらい音高く私の頬を殴れ。私はこの三日の間、たった一度だけ、ちらと君を疑った。生れて、はじめて君を疑った。君が私を殴ってくれなければ、私は君と抱擁できない。」
という感じの気分になったので、一念発起、readxlでもやってみました。
でもいまいちな感じ…。やはり羽鳥パッケージはtidyでないデータの前には弱い感じします。
library(readxl)
library(stringr)
library(dplyr)
url <- URLencode("http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_xlsDownload_&fileId=000006864467&releaseCount=1")
destfile <- tempfile(fileext = ".xlsx")
download.file(url, destfile = destfile)
raw_data <- read_excel(destfile, skip = 7)
(こ、これはちょっとずれすぎじゃない…?)
knitr::kable(raw_data, format = "html")
| NA | NA | 昭和 | 55年 1980 | 60年 1985 | 平成 | 7年 1995 | 12年 2000 | 13年 2001 | 14年 2002 | 15年 2003 | 16年 2004 | 17年 2005 | 18年 2006 | 19年 2007 | 20年 2008 | 21年 2009 | 22年 2010 | 23年 2011 | 24年 2012 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 総数 | NA | 6.3 | 6.7 | 7.7 | 7.9 | 8.0 | 8.1 | 8.9 | 9.7 | 10.10 | 10.5 | 10.7 | 10.7 | 11.60 | 13.1 | 12.0 | 11.9 | 12.642574 | 10.786938 | NA | NA |
| 男性 | 総数 | 6.7 | 7.6 | 8.7 | 9.8 | 10.1 | 10.7 | 11.1 | 11.6 | 11.80 | 12.6 | 13.0 | 13.1 | 13.31 | 14.6 | 14.1 | 13.7 | 14.410931 | 12.760085 | NA | NA |
| NA | 15~19歳 | 10.7 | 12.7 | 10.3 | 14.1 | 13.4 | 13.3 | 12.3 | 14.4 | 14.00 | 14.2 | 18.8 | 14.6 | 13.40 | 18.4 | 15.5 | 14.5 | 8.717949 | 12.299144 | NA | NA |
| NA | 20~29歳 | 15.5 | 19.5 | 23.5 | 25.5 | 30.8 | 30.5 | 27.9 | 26.5 | 29.52 | 34.3 | 33.1 | 30.5 | 28.60 | 30.0 | 33.0 | 29.7 | 34.082397 | 29.538784 | NA | NA |
| NA | 30~39歳 | 8.5 | 11.6 | 13.8 | 17.8 | 16.6 | 20.1 | 23.6 | 24.7 | 23.00 | 25.9 | 27.0 | 22.8 | 30.20 | 27.7 | 29.2 | 27.0 | 31.535270 | 25.784081 | NA | NA |
| NA | 40~49歳 | 4.9 | 6.6 | 8.7 | 11.1 | 11.6 | 10.5 | 14.4 | 14.3 | 15.90 | 19.0 | 16.2 | 20.8 | 17.90 | 25.7 | 19.3 | 20.5 | 23.456790 | 19.552195 | NA | NA |
| NA | 50~59歳 | 4.6 | 4.6 | 6.1 | 6.5 | 5.1 | 9.2 | 9.1 | 10.8 | 10.00 | 10.6 | 11.7 | 13.1 | 11.80 | 15.1 | 12.4 | 13.7 | 15.047619 | 13.053892 | NA | NA |
| NA | 60歳以上 | 3.4 | 2.8 | 3.5 | 2.0 | 1.7 | 2.9 | 2.5 | 3.4 | 3.70 | 3.6 | 4.2 | 3.9 | 5.40 | 6.3 | 7.0 | 6.7 | 4.856512 | 5.830000 | NA | NA |
| 女性 | 総数 | 5.9 | 5.9 | 5.9 | 6.1 | 6.1 | 5.8 | 6.9 | 7.9 | 8.50 | 8.7 | 8.6 | 8.5 | 10.10 | 11.9 | 10.1 | 10.3 | 11.101124 | 9.032497 | NA | NA |
| NA | 15~19歳 | 14.1 | 8.3 | 13.1 | 10.1 | 8.9 | 9.2 | 8.2 | 11.4 | 17.20 | 10.2 | 10.4 | 13.2 | 11.50 | 10.0 | 10.2 | 14.0 | 13.297872 | 10.669651 | NA | NA |
| NA | 20~29歳 | 11.7 | 12.9 | 14.7 | 14.3 | 18.2 | 16.3 | 16.9 | 20.6 | 23.60 | 22.0 | 23.5 | 22.5 | 24.90 | 26.2 | 23.2 | 28.6 | 28.828829 | 22.128955 | NA | NA |
| NA | 30~39歳 | 5.3 | 8.1 | 6.4 | 6.5 | 5.6 | 7.5 | 11.8 | 12.1 | 12.70 | 15.0 | 15.0 | 13.9 | 16.30 | 21.7 | 18.1 | 15.1 | 18.147448 | 14.784916 | NA | NA |
| NA | 40~49歳 | 5.8 | 5.7 | 6.7 | 7.5 | 6.1 | 6.6 | 7.9 | 9.0 | 7.60 | 7.8 | 10.3 | 11.0 | 12.80 | 14.8 | 12.1 | 15.2 | 16.014235 | 12.131048 | NA | NA |
| NA | 50~59歳 | 4.5 | 4.3 | 5.3 | 5.1 | 4.0 | 5.3 | 6.8 | 6.3 | 6.70 | 9.1 | 8.3 | 7.7 | 9.70 | 13.4 | 10.6 | 10.4 | 11.209964 | 9.248709 | NA | NA |
| NA | 60歳以上 | 4.1 | 3.1 | 3.4 | 2.8 | 2.5 | 2.1 | 2.3 | 3.7 | 4.10 | 4.0 | 4.1 | 3.2 | 4.40 | 6.8 | 5.8 | 5.0 | 5.474665 | 5.300000 | NA | NA |
| 注) 総数は1歳以上での平均。 | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| 平成24年は全国補正値である(p.8参照)。 | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
# 数字が4つつづくものを年数として取り出す。
years <- str_match(colnames(raw_data), "[[:digit:]]{4}")[,1]
years <- years[!is.na(years)]
colnames(raw_data) <- c("性別", "年齢", years)
result <- list()
# 今回は1行目は使いません
last_row <- raw_data[1,]
threshold <- ncol(raw_data)/2
for (i in 2:nrow(raw_data)) {
row <- raw_data[i,]
# ほとんどの要素がNAならそれはたぶんテーブルの下端
if(sum(is.na(row)) > threshold) {break}
# NAは上の行にある値で埋める
idx_na <- is.na(row)
row[,idx_na] <- last_row[,idx_na]
result[[length(result)+1]] <- row
last_row <- row
}
result_df <- bind_rows(result)
# ほとんどの要素がNAならそれはたぶんテーブルの右端
threshold <- nrow(result_df)/2
idx_na <- sapply(result_df, function(x){sum(is.na(x)) > threshold})
knitr::kable(result_df[,!idx_na], format = "markdown")
| 性別 | 年齢 | 1980 | 1985 | 1995 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 男性 | 総数 | 6.7 | 7.6 | 8.7 | 9.8 | 10.1 | 10.7 | 11.1 | 11.6 | 11.80 | 12.6 | 13.0 | 13.1 | 13.31 | 14.6 | 14.1 | 13.7 |
| 男性 | 15~19歳 | 10.7 | 12.7 | 10.3 | 14.1 | 13.4 | 13.3 | 12.3 | 14.4 | 14.00 | 14.2 | 18.8 | 14.6 | 13.40 | 18.4 | 15.5 | 14.5 |
| 男性 | 20~29歳 | 15.5 | 19.5 | 23.5 | 25.5 | 30.8 | 30.5 | 27.9 | 26.5 | 29.52 | 34.3 | 33.1 | 30.5 | 28.60 | 30.0 | 33.0 | 29.7 |
| 男性 | 30~39歳 | 8.5 | 11.6 | 13.8 | 17.8 | 16.6 | 20.1 | 23.6 | 24.7 | 23.00 | 25.9 | 27.0 | 22.8 | 30.20 | 27.7 | 29.2 | 27.0 |
| 男性 | 40~49歳 | 4.9 | 6.6 | 8.7 | 11.1 | 11.6 | 10.5 | 14.4 | 14.3 | 15.90 | 19.0 | 16.2 | 20.8 | 17.90 | 25.7 | 19.3 | 20.5 |
| 男性 | 50~59歳 | 4.6 | 4.6 | 6.1 | 6.5 | 5.1 | 9.2 | 9.1 | 10.8 | 10.00 | 10.6 | 11.7 | 13.1 | 11.80 | 15.1 | 12.4 | 13.7 |
| 男性 | 60歳以上 | 3.4 | 2.8 | 3.5 | 2.0 | 1.7 | 2.9 | 2.5 | 3.4 | 3.70 | 3.6 | 4.2 | 3.9 | 5.40 | 6.3 | 7.0 | 6.7 |
| 女性 | 総数 | 5.9 | 5.9 | 5.9 | 6.1 | 6.1 | 5.8 | 6.9 | 7.9 | 8.50 | 8.7 | 8.6 | 8.5 | 10.10 | 11.9 | 10.1 | 10.3 |
| 女性 | 15~19歳 | 14.1 | 8.3 | 13.1 | 10.1 | 8.9 | 9.2 | 8.2 | 11.4 | 17.20 | 10.2 | 10.4 | 13.2 | 11.50 | 10.0 | 10.2 | 14.0 |
| 女性 | 20~29歳 | 11.7 | 12.9 | 14.7 | 14.3 | 18.2 | 16.3 | 16.9 | 20.6 | 23.60 | 22.0 | 23.5 | 22.5 | 24.90 | 26.2 | 23.2 | 28.6 |
| 女性 | 30~39歳 | 5.3 | 8.1 | 6.4 | 6.5 | 5.6 | 7.5 | 11.8 | 12.1 | 12.70 | 15.0 | 15.0 | 13.9 | 16.30 | 21.7 | 18.1 | 15.1 |
| 女性 | 40~49歳 | 5.8 | 5.7 | 6.7 | 7.5 | 6.1 | 6.6 | 7.9 | 9.0 | 7.60 | 7.8 | 10.3 | 11.0 | 12.80 | 14.8 | 12.1 | 15.2 |
| 女性 | 50~59歳 | 4.5 | 4.3 | 5.3 | 5.1 | 4.0 | 5.3 | 6.8 | 6.3 | 6.70 | 9.1 | 8.3 | 7.7 | 9.70 | 13.4 | 10.6 | 10.4 |
| 女性 | 60歳以上 | 4.1 | 3.1 | 3.4 | 2.8 | 2.5 | 2.1 | 2.3 | 3.7 | 4.10 | 4.0 | 4.1 | 3.2 | 4.40 | 6.8 | 5.8 | 5.0 |