Rで都道府県名を処理するときのメモ
Rで都道府県のデータを触っていると、都道府県名に県がついているデータとついていないデータ(例:青森と青森県)があり、都道府県名をkeyとしてデータフレームを{dplyr}の*_join()系の関数で結合させるときに大変に不便なことがある。
ということでいずれかに統一する必要があるので、それ用の関数のメモ。いつもどこかにやってコピペするのでなくさないようにここに貼っておく。
県等がついていない都道府県名に県等をつける場合。{dplyr}と{stringr}パッケージを要する。
add_ken <- function(x) dplyr::case_when(x == "東京" ~ "東京都", x %in% c("京都", "大阪") ~ paste0(x, "府"), !stringr::str_detect(x, "県") & !(x %in% c("東京都", "京都府", "大阪府", "北海道", "全国")) ~ paste0(x, "県"), .default = x)
北海道は北海となることは基本的にはない(少なくとも行政が作ったデータを触っている範囲では)ので、それ以外で都府県がつくように処理する。行政データを触っていると全国が集計済みで存在することがあるのでそれもとりあえず取り扱えるようにしている。
add_ken(c("青森", "北海道", "京都", "東京"))
## [1] "青森県" "北海道" "京都府" "東京都"
add_ken("AKITA")
## [1] "AKITA県"
行政が作ったデータを触る範囲では上記の関数で十分。
逆に都道府県名から県等を取り除く場合は次の通り。
remove_ken <- function(x) dplyr::case_when(x == "東京都" ~ "東京", stringr::str_detect(x, "府") ~ stringr::str_remove(x, "府"), stringr::str_detect(x, "県") ~ stringr::str_remove(x, "県"), .default = x)
使ってみると次の通り。
remove_ken(c("東京都", "北海道", "秋田県", "沖縄県", "大阪府", "京都府"))
## [1] "東京"   "北海道" "秋田"   "沖縄"   "大阪"   "京都"
都道府県データを地域区分(東北や東海など)で集計しデータを処理したい時がある。今回の地域区分は総務省の地域課題2024の区分に従っている。
地域区分 : 地域課題分析レポート(2024年秋号) - 内閣府
chiikikubun_2024 <- function(x){dplyr::case_when(x %in% c("北海道") ~ "北海道", x %in% c("青森県", "岩手県", "秋田県", "宮城県", "山形県", "福島県") ~ "東北", x %in% c("茨城県", "栃木県", "群馬県") ~ "北関東", x %in% c("埼玉県", "千葉県", "東京都", "神奈川県") ~ "南関東(東京圏)", x %in% c("新潟県", "山梨県", "長野県") ~ "甲信越", x %in% c("静岡県", "岐阜県", "愛知県", "三重県") ~ "東海", x %in% c("富山県", "石川県", "福井県") ~ "北陸", x %in% c("滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県") ~ "近畿", x %in% c("鳥取県", "島根県", "岡山県", "広島県", "山口県") ~ "中国", x %in% c("徳島県", "香川県", "愛媛県", "高知県") ~ "四国", x %in% c("福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県") ~ "九州", x %in% c("沖縄県") ~ "沖縄" )}
使ってみると次の通り。
chiikikubun_2024(c("東京都", "北海道", "秋田県", "沖縄県", "大阪府", "京都府", "全国"))
## [1] "南関東(東京圏)" "北海道"           "東北"             "沖縄"            
## [5] "近畿"             "近畿"             NA
上記のコードでは都道府県名以外はNAで返ってくることになる(しそっちのほうが都合がいいこともある)が、.default引数を調整すると処理できる。
# 都道府県名以外はそのままの文字列を返す場合 chiikikubun_2024_ <- function(x){dplyr::case_when(x %in% c("北海道") ~ "北海道", x %in% c("青森県", "岩手県", "秋田県", "宮城県", "山形県", "福島県") ~ "東北", x %in% c("茨城県", "栃木県", "群馬県") ~ "北関東", x %in% c("埼玉県", "千葉県", "東京都", "神奈川県") ~ "南関東(東京圏)", x %in% c("新潟県", "山梨県", "長野県") ~ "甲信越", x %in% c("静岡県", "岐阜県", "愛知県", "三重県") ~ "東海", x %in% c("富山県", "石川県", "福井県") ~ "北陸", x %in% c("滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県") ~ "近畿", x %in% c("鳥取県", "島根県", "岡山県", "広島県", "山口県") ~ "中国", x %in% c("徳島県", "香川県", "愛媛県", "高知県") ~ "四国", x %in% c("福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県") ~ "九州", x %in% c("沖縄県") ~ "沖縄", .default = x )}
使ってみると次の通り。
chiikikubun_2024_(c("東京都", "北海道", "秋田県", "沖縄県", "大阪府", "京都府", "全国"))
## [1] "南関東(東京圏)" "北海道"           "東北"             "沖縄"            
## [5] "近畿"             "近畿"             "全国"
他にもいろいろな地域区分があるが、上記のコードを書き換えると0から作るより比較的早くできる。
ちなみに、行政データの一部では都道府県名の先頭に都道府県コード2桁がくっついているものがある(北海道なら01北海道)。
これを取り除くには、
stringr::str_remove("01北海道", "[[:digit:]]+")
## [1] "北海道"
などとすればいい。
逆にくっつける場合は都道府県コードと都道府県名を突合する必要があるのでたとえば、github上にある{jaddress.jiscode}などを使って都道府県名から都道府県コードを取り出す作業をしてくっつけるといい。
# 都道府県コードを確認 jaddress.jiscode::jaddress_jiscode(c("北海道", "宮城県", "東京都", "鹿児島県"), "pref")
## [1] "01" "04" "13" "46"
# くっつける paste0(jaddress.jiscode::jaddress_jiscode(c("北海道", "宮城県", "東京都", "鹿児島県"), "pref"), c("北海道", "宮城県", "東京都", "鹿児島県"))
## [1] "01北海道"   "04宮城県"   "13東京都"   "46鹿児島県"
行政データを触るとまぁまぁ使う処理系のメモ。