R(インターネット)

2025年1月 9日 (木)

[R]行政機関の営業日数を求める

行政機関の休日は、土日祝日と12/31~1/3。これを指定の年度の日付型ベクトルから取り除けばよい。以下は2024年度(2024-04-01/2025-03-31)の行政機関の営業日数を調べた例。土日と年末年始はweekdays関数を使えば機械的に取り除ける。祝日の判定には、内閣府のウェブサイトで公開されている祝日をCSV形式で納めたファイルを利用している。2024年11月現在、昭和30年(1955年)~令和7年(2025年)の祝日が納められている。

> # 下準備
> library(tidyverse)
> options(readr.show_progress = FALSE, readr.show_col_types = FALSE)
> loc <- locale(encoding = "Shift_JIS")
> s <- "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
> hday <- read_csv(s, locale = loc)
> colnames(hday) <- c("date", "name")
> hday$date <- as.Date(hday$date)
> # 営業日数を計算する年度を西暦で指定
> nendo <- 2024
> # 営業日数の計算開始
> dt1 <- as.Date(ISOdate(nendo, 4, 1))
> dt2 <- as.Date(ISOdate(nendo + 1, 3, 31))
> # まずは年度のすべてを日(365or366日)を作成
> bday <- tibble(date = seq(dt1, dt2, by = "day"))
> # 当該年度のすべての日に曜日情報を追加
> bday <- bday |> mutate(wday = weekdays(date, abbreviate = TRUE))
> # すべての日から土日を取り除く
> bday <- bday |> filter(!str_detect(wday, "土|日"))
> # (すべての日)-(土日)-(祝日)
> bday <- bday |> anti_join(hday, by = join_by(date == date))
> # 最後に年末年始の6日間を取り除く(土日祝日削除で既に無い可能性有り)
> dth1 <- as.Date(ISOdate(nendo, 12, 29))
> dth2 <- as.Date(ISOdate(nendo + 1, 1, 3))
> bday <- bday |> filter(date < dth1 | date > dth2)
> # 結果を出力
> cat(sprintf("%d年度の営業日数は %d 日\n", nendo, nrow(bday)))
2024年度の営業日数は 243 日

2024年3月30日 (土)

[R]ウェブサイトのページの文字コードを調べる

rvestパッケージのread_html関数とhtml_node関数を組み合わせて使う。以下の例では、ページの文字コードがUTF-8であることがわかる。

> library(dplyr)
> library(rvest)
> s <- "https://www.kunaicho.go.jp"
> html <- read_html(s)
> html %>% html_node(xpath = "//meta[@content | @charset]")
{html_node}
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

2024年3月28日 (木)

[R]パーセントエンコーディングを行う

URLencode関数を使う。

> URLencode("和多田美咲")
[1] "%E5%92%8C%E5%A4%9A%E7%94%B0%E7%BE%8E%E5%92%B2"

試しに、このパーセントエンコーディングを使用して、Googleで「和多田美咲」で検索した結果のページを開いてみる。

> s <- "https://www.google.co.jp/search?q="
> s <- paste0(s, URLencode("和多田美咲"))
> print(s)
[1] "https://www.google.co.jp/search?q=%E5%92%8C%E5%A4%9A%E7%94%B0%E7%BE%8E%E5%92%B2"
> browseURL(s)

R_urlencode

2024年3月25日 (月)

[R]URLをブラウザーで開く

browseURL関数を使う。Googleのトップページを既定のブラウザーで開いてみる。

> browseURL("https://www.google.co.jp")

起動するブラウザーを指定する場合はbrowserオプションにブラウザーの本体(.exe)をフルパスで指定する。browserオプションを指定した場合、ブラウザーの起動に成功すると0、失敗知ると0以外の戻り値が返る。Windows 10でEdgeを指定して開く場合は以下の最後の例のようになる。

> browseURL("https://www.google.co.jp", browser = "C:/Program Files (x86)/Microsoft/firefox.exe")
[1] 127
警告メッセージ:
system(paste0("\"", browser, "\" ", if (encodeIfNeeded) URLencode(url) else url), で:
'"C:/Program Files (x86)/Microsoft/firefox.exe"' not found
> browseURL("https://www.google.co.jp", browser = "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe")
[1] 0

2023年12月24日 (日)

[R]郵便番号の一覧を得る

以下は2023年12月中旬に、日本郵便株式会社のウェブサイトから郵便番号の情報が納められたファイルをダウンロードして、郵便番号とそれに対応する町域等をデータフレームにした例。UTF-8形式のファイルをダウンロードしている。ダウンロードしたファイルはテンポラリファイルとして保存をして削除をしているが、そのファイルから展開したファイル(utf_ken_all.csv)はカレントディレクトリに保存をして、そのまま残していることに注意。

> url <- "https://www.post.japanpost.jp/zipcode/dl/utf/zip/utf_ken_all.zip"
> tfile <- tempfile()
> download.file(url, tfile)
URL 'https://www.post.japanpost.jp/zipcode/dl/utf/zip/utf_ken_all.zip' を試しています
Content type 'application/zip' length 2030910 bytes (1.9 MB)
downloaded 1.9 MB
> unzip(tfile)
> unlink(tfile)
> file.info(dir(pattern = "utf_ken_all\\.csv"))["size"]
size
utf_ken_all.csv 18333268
> zip <- read.table("utf_ken_all.csv", sep = ",", colClasses = "character")

町域で検索を試してみる。レゴランドジャパンが位置する住所(金城ふ頭)を検索してみると、一か所しか登録されていないことがわかる。ユニバーサル・スタジオ・ジャパンが位置する「桜島」も同様。「安野」が含まれる町域は複数あるが「希世乃」という町域は一か所も登録されていないことがわかる。

> subset(zip, grepl("^金城ふ頭$", V9), c(V3, V7, V8, V9))
V3 V7 V8 V9
67272 4550848 愛知県 名古屋市港区 金城ふ頭
> subset(zip, grepl("^桜島$", V9), c(V3, V7, V8, V9))
V3 V7 V8 V9
84513 5540031 大阪府 大阪市此花区 桜島
> subset(zip, grepl("安野", V9), c(V3, V7, V8, V9))
V3 V7 V8 V9
47777 9592003 新潟県 阿賀野市 安野町
47936 9592004 新潟県 阿賀野市 南安野町
49858 9300087 富山県 富山市 安野屋町
110837 7890253 高知県 長岡郡大豊町 安野々
114419 8380213 福岡県 朝倉郡筑前町 安野
> subset(zip, grepl("希世乃", V9), c(V3, V7, V8, V9))
[1] V3 V7 V8 V9
<0 行> (または長さ 0 の row.names)

2023年12月22日 (金)

[R]全国の地方自治体のコード(全国地方公共団体コード)を一覧形式で得る

地方公共団体情報システム機構のウェブサイト(https://www.j-lis.go.jp/)では、地方自治体に割り当てた6桁の数字(全国地方公共団体コード)を公開している。全国の地方自治体を一つにまとめたファイルを以前はダウンロードすることができたが、現在は登録した団体しかそのサービスを利用することができない。

ウェブサイトでは県別に一覧表を掲載しているため、これをスクレイピングすることで、一括で得ることができる。以下、入手例。

> library(rvest)
> library(tidyverse)
> url <- "https://www.j-lis.go.jp/spd/code-address/jititai-code.html"
> html <- read_html(url)
> node <- html %>% html_nodes("a")
> idx <- grep("[都道府県]内[区市]", node)
> url9 <- node[idx] %>% html_attr("href")
> url <- paste0("https://www.j-lis.go.jp", url9)
> la0 <- as_tibble(NULL)
> for (i in seq(url)) {
+ lis <- read_html(url[i]) %>% html_table()
+ la0 <- rbind(la0, lis[[1]])
+ }
> la <- select(la0, 1:3) %>% rename(code = 1, name = 2, furigana = 3)
> la <- la %>% mutate(code = sprintf("%06d", code))

以下は、2023年12月中旬に行った結果。市は792、町は743、村は183あることがわかる(北方領土の6村は含まない)。

> head(la, 3) %>% as.data.frame()
code name furigana
1 011002 札幌市 さっぽろし
2 011011 札幌市中央区 さっぽろしちゅうおうく
3 011029 札幌市北区 さっぽろしきたく
> tail(la, 3) %>% as.data.frame()
code name furigana
1 473758 多良間村 たらまそん
2 473812 竹富町 たけとみちょう
3 473821 与那国町 よなぐにちょう
> la %>% filter(str_detect(name, "市$")) %>% nrow()
[1] 792
> length(grep("町$", la$name))
[1] 743
> length(grep("村$", la$name))
[1] 183

2023年9月 7日 (木)

[R]プロキシを設定する(Windows版)

学校や職場でネットワークにプロキシが設定されている場合、パッケージのインストールがうまくいかないことがある。例えば、magickパッケージをインストールしてみる。

> install.packages("magick")
パッケージを ‘C:/Users/○○○’ 中にインストールします
(‘lib’ が指定されていないため)
--- このセッションで使うために、CRAN のミラーサイトを選んでください ---
警告: failed to download mirrors file ( URL 'https://cran.r-project.org/CRAN_mirrors.csv' を開けません ); using local file '○○○/CRAN_mirrors.csv'
警告: リポジトリー https://○○○/pub/cran/src/contrib に対する索引にアクセスできません :
URL 'https://○○○/pub/cran/src/contrib/PACKAGES' を開けません

ミラーサイト選択のダイアログ表示まで10秒以上待たされ、選択後に30秒以上経過して「~に対する索引にアクセスできません」と表示された場合は、プロキシに接続しようとして失敗している可能性が高い。

このような状態では、curlGetHeaders関数でhttp://www.google.co.jpのヘッダーを読み取ると、以下のようなエラーが生じるはず。

> curlGetHeaders("http://www.google.co.jp")
curlGetHeaders("http://www.google.co.jp") でエラー:
libcurl error code ○:
Failed to connect to www.google.co.jp port ○ after ○ ms: Couldn't connect to server

プロキシの設定を正しく行うことで解決できる。

「コントロールパネル」→「ユーザーアカウント」→左側メニュー「環境変数の変更」。

上のユーザー環境変数に、以下の2つの環境変数を設定する。ここでプロキシのアカウント名はnamae、そのパスワードはpasu。プロキシサーバーのアドレスはproxy.company.co.jp、そのポートは1234としている。2つ目のHTTPS_PROXYは「http:~」であることに注意。

HTTP_PROXY

http://namae:pasu@proxy.company.co.jp:1234
HTTPS_PROXY

http://namae:pasu@proxy.company.co.jp:1234

設定後に、Rを再起動してcurlGetHeaders関数でhttp://www.google.co.jpのヘッダーを取得してみる。

> curlGetHeaders("http://www.google.co.jp")
[1] "HTTP/1.0 200 OK\r\n"
(以下、表示省略)

上記のように表示されればプロキシの設定は成功。install.packages関数でパッケージのインストールが出来るようになるはず。

以下のように表示された場合は、アカウント名やパスワードの設定を間違えている可能性が高い。

> curlGetHeaders("http://www.google.co.jp")
[1] "HTTP/1.0 407 Proxy Authentication Required\r\n"
(表示省略)
無料ブログはココログ

■■

■■■