library(magrittr)

敬愛するユタニーのあれ http://rpubs.com/yutannihilation/122268

正規表現にはまっている私としては、これこそ正規表現けじめ案件なのではという印象があったので挑戦してみる。

(と言いつつ、申し訳程度に正規表現使った程度ですまない。本当にすまん)

パッケージとデータセットの読み込み

library(Nippon)
## Loading required package: maptools
## Loading required package: sp
## Checking rgeos availability: TRUE
library(choroplethrAdmin1)
data("prefectures")

県名はNipponパッケージの内臓データを使わせてもらう。このような塩梅になっている。

dplyr::tbl_df(prefectures)
## Source: local data frame [47 x 3]
## 
##    jiscode   name region
##      (chr)  (chr)  (chr)
## 1       01 北海道 北海道
## 2       02 青森県   東北
## 3       03 岩手県   東北
## 4       04 宮城県   東北
## 5       05 秋田県   東北
## 6       06 山形県   東北
## 7       07 福島県   東北
## 8       08 茨城県   関東
## 9       09 栃木県   関東
## 10      10 群馬県   関東
## ..     ...    ...    ...
pref_alpha <- kakasi(prefectures$name)
names(pref_alpha) <- NULL # 都道府県名(漢字)はいらないので消す
pref_alpha
##  [1] "hokkaidou"    "aomoriken"    "iwateken"     "miyagiken"   
##  [5] "akitaken"     "yamagataken"  "fukushimaken" "ibarakiken"  
##  [9] "tochigiken"   "gunmaken"     "saitamaken"   "chibaken"    
## [13] "toukyouto"    "kanagawaken"  "niigataken"   "toyamaken"   
## [17] "ishikawaken"  "fukuiken"     "yamanashiken" "naganoken"   
## [21] "gifuken"      "shizuokaken"  "aichiken"     "mieken"      
## [25] "shigaken"     "kyoutofu"     "oosakafu"     "hyougoken"   
## [29] "naraken"      "wakayamaken"  "tottoriken"   "shimaneken"  
## [33] "okayamaken"   "hiroshimaken" "yamaguchiken" "tokushimaken"
## [37] "kagawaken"    "ehimeken"     "kouchiken"    "fukuokaken"  
## [41] "sagaken"      "nagasakiken"  "kumamotoken"  "ooitaken"    
## [45] "miyazakiken"  "kagoshimaken" "okinawaken"

こっちが{choroplethrAdmin1}の都道府県名。ユタニーの言う通り、「県」とか「府」といった都道府県表記ではない。

(pref_choro <- get_admin1_regions("japan")$region)
##  [1] "aichi"     "akita"     "aomori"    "chiba"     "ehime"    
##  [6] "fukui"     "fukuoka"   "fukushima" "gifu"      "gunma"    
## [11] "hiroshima" "hokkaido"  "hyogo"     "ibaraki"   "ishikawa" 
## [16] "iwate"     "kagawa"    "kagoshima" "kanagawa"  "kochi"    
## [21] "kumamoto"  "kyoto"     "mie"       "miyagi"    "miyazaki" 
## [26] "nagano"    "nagasaki"  "nara"      "niigata"   "oita"     
## [31] "okayama"   "okinawa"   "osaka"     "saga"      "saitama"  
## [36] "shiga"     "shimane"   "shizuoka"  "tochigi"   "tokushima"
## [41] "tokyo"     "tottori"   "toyama"    "wakayama"  "yamagata" 
## [46] "yamaguchi" "yamanashi"

というわけで、Nippon::prefecturesの方の都道府県名から「県」、「都」、「府」を抜き取る。

# 文字列の最後が'ken', 'fu', 'to'にマッチするものを置換(北海道だけそのまま)
pref_alpha %<>% gsub(pattern = "ken$|fu$|to$", replacement = "", .)
equals(pref_choro, pref_alpha) %>% sum()
## [1] 1

2つを比較してみる。が、全くあっていないとのこと。以下の2点の問題があるために名寄せがうまくいっていない。

  1. 並び順… Nippon::prefecturesではjisコード順、{choroplethrAdmin1}ではローマ字のアルファベット順になっている -> sort()関数でなんとかできる。
  2. ローマ字表記のずれ -> kana2roma()関数で頑張る(以下で対応)

というわけで、2つともアルファベット順に並び替えたのちにローマ字読みをゴリゴリ修正する。

pref_alpha %<>% sort()
equals(pref_alpha, pref_choro) %>% sum()
## [1] 37

この段階でもまだ一致していない都道府県がある。そこで、文字列をローマ字表記に変更してくれるkana2roma()を利用する。kana2roma()では、ローマ字表記に対して、いわゆるヘボン式、日本式、訓令式の3種に対応している。

pref_alpha %<>% kana2roma(type = "Hepburn") %>% sort()
pref_choro %<>% kana2roma(type = "Nippon.shiki")

確認のため、一度データフレームにして一致していない箇所を見てみる。

dplyr::anti_join(data.frame(id = 1:47, name = pref_alpha), data.frame(id = 1:47, name = pref_choro))
## Joining by: c("id", "name")
## Warning in anti_join_impl(x, y, by$x, by$y): joining factors with different
## levels, coercing to character vector
##   id    name
## 1 38 shizoka
## 2 10   gumma
## 3  7   fukui
## 4  6  fukoka

残っている部分はちまちまと直す感じで。

pref_choro[c(7, 10, 38)] %<>% kana2roma("Hepburn")

pref_choro %<>% sort()
  # fukoka はfukuiの表記を直すと順番が入れ替わるので特に変更する必要はない
equals(pref_choro, pref_alpha) %>% sum()
## [1] 47

無事に47都道府県の名寄せが終わった。

Stay gold…