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