今回はISOの国コードです。なんちゃら.co.jpのjp とか2文字もあり、JPNと3文字もあり。日本のように「単純明快」な国は良いですが、世界的にはそうでない国も多いと。複数の地域に分かれる場合もあり、また、国家の主権との関係もあり、ムツカシーみたいです。その辺を「正規表現」でええ感じに検索できるみたいです。
※「データのお砂場」投稿順Indexはこちら
※使用させていただいている Rのversionは 4.3.1。RStudioは 2024.04.2+764 “Chocolate Cosmos” です。
第168回の訂正
今回、iso3166というサンプルデータセットを扱っていて気付いたのが、「カナダ1国の地図、とりだせるじゃん」という点です。第168回で世界地図は表示できるけど、カナダ1国表示ができんと座標指定でお茶を濁してましたが、さにあらず、ちょいとテクを使えばカナダ1国(カナダといわず国コードが振られているどの地域でも)取り出せることに気づきました。こんな感じ。
上記の描画は、mapsパッケージ内のsov.expand関数を使って以下のように指定してます。
map(regions=sov.expand("Canada"))
なお、sov.expand関数を使わずに素でregion=”Canada”とする以下のケースはイマイチです。
map(regions="Canada")
こんな感じ。勝手に「トリミング」されとりますな。なんでだろ~。
ISO3166-1
この国際規格については、Googleの生成AI、Gemini様にご説明していただきました。お願いすればらくちん。いいのか、そんなことで。
普段から、結構お世話になっているアレ、みたいです。
このサンプルデータセットの解説ページが以下に。
なお、ISO3166-1では、2文字および3文字の国コードの他に数値で示す(numeric)コードも規定されているみたいですが、numericコードはこのサンプルデータセットには含まれてません。
先ずは生データ
mapsパッケージのデータなので、library(maps) した後でデータをロードしてみます。
269の国と地域について、2文字コード、3文字コードと2種のお名前、主権を列挙したデータベースみたいです。
なお、上記の解説ページでは単に name とされている第1のお名前は、ロードした上記のデータベースでは ISOname となってます。微妙に差があるのね。
ただただコードとお名前が列挙されているデータベースですが、mapsパッケージ内にはこれを扱うための関数が準備されています。
-
- iso.expand(a, regex=TRUE)、isoコードのベクトル(a2またはa3、すべて同型式)をmapnameに変換、その際、regex=TRUEだと正規表現で結果を得る。regex=FALSEとすると単なる文字列リストで得る。
- sov.expand(sov, regex=TRUE)、主権国名のベクトルをmapnameに変換、その際、regex=TRUEだと正規表現で結果を得る。regex=FALSEとすると単なる文字列リストで得る。
- iso.alpha(x, n=2)、xに与えた国名をn=2なら2文字、n=3なら3文字のISOコードに変換する。
例えばフィンランドのオーランド諸島は、フィンランド本土とは別な地域名を与えられてます。
Finlandを sov.expand関数でmapnameに展開すると上記のように2つのmapnameを抽出できます。
処理例を実行してみる
処理例の冒頭にフランスがあがっていたので、これを使って関数どもを練習してみます。regexのTRUEとFALSEでの結果の違いがわかるようにやってみたのが以下です。
何も指定しないと regex=TRUEと同じ。FALSE指定でリストとなります。
map(regions=sov.expand("France"), fill=TRUE, col=2)
上記のように指定すれば、フランスとその海外領土の全貌を地図に描くことができます。こんな感じ。
世界地図上での指定なのでそれぞれの面積小さいっすけど、フランスは日の沈まぬ大国ですな。
ただしISOコードでフランス本国を表す FR にはからくり?ありみたいです。以下のように指定すると2か所のmapnameが得られます。
「クリッパートン島」ってどこよ?とお惚け老人はその所在を知らず。しかし無線界隈?では有名な島でした。メキシコの遥か沖合、太平洋上の無人島です。結構、国際法上の先例にもなっている島みたい。フランスの海外領土の多くは自治政府などあってそれぞれ運営されているけど、ここは無人島なのでフランス本国政府直属らしいです。それでコードはFRみたい。
まあこういう離島のケースは各地にあり。スペインの場合を地図にするのが以下に。
map(regions=sov.expand("Spain"))
処理例の下の方に、ヨーロッパ地域のISOコード(2文字)をmap.text使って地図上にちりばめた例があったのでやってみます。
wm <- map("world", fill=TRUE, col=0, xlim=c(-10,40), ylim=c(30,60)) nam <- grep(":", wm$names, inv=TRUE, val=TRUE) map.text(wm, regions=nam, label=iso.alpha(nam), col=2, exact=TRUE, add=TRUE)
結果が以下に。
よく見ると、IM(マン島)はあるけれど、GB(グレートブリテン、英国)がみあたりませぬ。上記のような処理例の抽出方法をとると、英国は外れてしまうみたい。。。なして?謎だ。