R入門
インターネット
最終更新:
r-intro
目次
基本操作
インターネット上のファイルをダウンロードする
download.file関数を使う。第一引数にダウンロードしたいインターネット上のファイルをURLで、第二引数に保存するファイル名を指定する。以下は、2025年4月に、プロジェクト・グーテンベルクに掲載されている「赤毛のアン」の原著をテキストで納めているテキストファイルをダウンロードして、一時的なファイル名で保存した例。
当該ファイルは文字コードはUTF-8(BOM付き)、改行コードはCR+LFで保存されており、download.file関数のmodeオプションに"wb"を指定しないと、ダウンロード時に改行コードをCR+CR+LFに変換して保存するので注意(it does distinguish between text and binary files and for text transfers changes ‘\n’ line endings to ‘\r\n’ (aka ‘CRLF’).)。
> urlname <- "https://www.gutenberg.org/ebooks/45.txt.utf-8"
> filepath <- tempfile()
> download.file(urlname, filepath, mode = "wb")
URL 'https://www.gutenberg.org/ebooks/45.txt.utf-8' を試しています
Content type 'text/plain; charset=utf-8' length 606739 bytes (592 KB)
downloaded 592 KB
ダウンロードしたファイルを試しに読み込んでみる。最後に、ダウンローしたファイルは削除している。
> library(tidyverse)
> options(readr.show_progress = FALSE, readr.show_col_types = FALSE)
> lines <- read_lines(filepath, locale = locale(encoding = "UTF-8"))
> head(lines, 15)
[1] "The Project Gutenberg eBook of Anne of Green Gables"
[2] " "
[3] "This ebook is for the use of anyone anywhere in the United States and"
[4] "most other parts of the world at no cost and with almost no restrictions"
[5] "whatsoever. You may copy it, give it away or re-use it under the terms"
[6] "of the Project Gutenberg License included with this ebook or online"
[7] "at www.gutenberg.org. If you are not located in the United States,"
[8] "you will have to check the laws of the country where you are located"
[9] "before using this eBook."
[10] ""
[11] "Title: Anne of Green Gables"
[12] ""
[13] "Author: L. M. Montgomery"
[14] ""
[15] "Release date: June 27, 2008 [eBook #45]"
> tail(lines, 5)
[1] "including how to make donations to the Project Gutenberg Literary"
[2] "Archive Foundation, how to help produce our new eBooks, and how to"
[3] "subscribe to our email newsletter to hear about new eBooks."
[4] ""
[5] ""
> file.remove(filepath)
[1] TRUE
Webサイトの証明書を調べる
opensslパッケージのdownload_ssl_cert関数を使う。以下は首相官邸のWebサイトの証明書を調べた例。
> library(openssl)
> r <- download_ssl_cert("www.kantei.go.jp")
> print(r)
[[1]]
[x509 certificate] *.kantei.go.jp
md5: d3d1602d86f62630c270db1a641313c1
sha1: 71b0f7c5b22eed8f29e5d29b916363a6e98bbe93
[[2]]
[x509 certificate] GlobalSign RSA OV SSL CA 2018
md5: a75d8b210911ee173efd25e1e00ed6fd
sha1: dfe83023062b997682708b4eab8e819aff5d9775
WebサイトのWebページをダウンロードする
rvestパッケージのread_html関数を使う。
> library(rvest)
> s <- read_html("https://mainichi.jp")
> print(s)
{html_document}
<html lang="ja">
(以下、表示省略)
プロキシ等の設定で、以下のようなエラーが発生して実行できない場合がある。
> s <- read_html("https://mainichi.jp")
open.connection(x, "rb") でエラー:
Timeout was reached: [○○] Connection timeout after ○○ ms
このような場合は、download.file関数を利用した以下のような関数を自作する。read_html関数による戻り値と全く同じ戻り値が得られる。
read_html2 <- function(urlname) {
filename <- tempfile()
download.file(urlname, destfile = filename)
return(read_html(filename))
}
> library(rvest)
> read_html2 <- function(urlname) {
+ filename <- tempfile()
+ download.file(urlname, destfile = filename)
+ return(read_html(filename))
+ }
> s <- read_html2("https://mainichi.jp")
URL 'https://mainichi.jp' を試しています
downloaded 163 KB
> print(s)
{html_document}
<html lang="ja">
(以下、表示省略)
WebサイトのHTTP応答ヘッダーを表示する
curlGetHeaders関数を使う。以下は首相官邸のWebサイトのHTTP応答ヘッダーを読み込んで表示した例。
> curlGetHeaders("https://www.kantei.go.jp")
[1] "HTTP/1.1 200 OK\r\n"
[2] "Content-Type: text/html\r\n"
[3] "Content-Length: 34079\r\n"
[4] "Connection: keep-alive\r\n"
[5] "x-amz-id-2: 5WwFUp70CdeHuaZnA6D4JHd6TMOLP+rMlDThFyJyK0L36Ef56JmQBErMN9ykfOxqDFTsOL2fMKfTFT86HK1t5A==\r\n"
[6] "x-amz-request-id: XS0PB5HEJW6JWJ34\r\n"
[7] "x-amz-replication-status: COMPLETED\r\n"
[8] "Last-Modified: Fri, 16 Jun 2023 11:47:26 GMT\r\n"
[9] "x-amz-server-side-encryption: AES256\r\n"
[10] "x-amz-version-id: jWmosSt3Co6lQohIyEfv7ei_AOH7v3MI\r\n"
[11] "Accept-Ranges: bytes\r\n"
[12] "Server: none\r\n"
[13] "Date: Fri, 16 Jun 2023 12:11:03 GMT\r\n"
[14] "ETag: \"f82848ddba52d80055f6700388dca50a\"\r\n"
[15] "X-Cache: Hit from cloudfront\r\n"
[16] "Via: 1.1 9d4586c3d96c296deb0177ba3471c4a4.cloudfront.net (CloudFront)\r\n"
[17] "X-Amz-Cf-Pop: NRT57-P3\r\n"
[18] "X-Amz-Cf-Id: 85ur58h0Nu7ZeEYeAkB1z6jq1tsUH9E1gVDRSb_rOPsfU0Z_F4g62Q==\r\n"
[19] "Age: 25\r\n"
[20] "X-Frame-Options: SAMEORIGIN\r\n"
[21] "\r\n"
attr(,"status")
[1] 200
プロキシを設定する(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"
(表示省略)
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
ウェブサイトのページの文字コードを調べる
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">
公開情報の利用
全国の地方自治体のコード(全国地方公共団体コード)を一覧形式で得る
地方公共団体情報システム機構のウェブサイト(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年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)
祝日を一覧形式で得る
内閣府のウェブサイトの以下のページでは、昭和30年(1955年)~令和7年(2025年)の祝日をCSV形式のファイルで公開している(2024年11月現在)。これを利用する。
https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
以下はそのCSVファイルを利用して、令和6年度(2024-04-01/2025-03-31)の祝日を抜き出した例。
> library(tidyverse)
> options(readr.show_progress = FALSE, readr.show_col_types = FALSE)
> s <- "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
> loc <- locale(encoding = "Shift_JIS")
> hday <- read_csv(s, locale = loc)
> colnames(hday) <- c("date", "name")
> tib <- hday |> filter(date >= as.Date("2024-04-01") & date <= as.Date("2025-03-31"))
> tib |> as.data.frame()
date name
1 2024/4/29 昭和の日
2 2024/5/3 憲法記念日
3 2024/5/4 みどりの日
4 2024/5/5 こどもの日
5 2024/5/6 休日
6 2024/7/15 海の日
7 2024/8/11 山の日
8 2024/8/12 休日
9 2024/9/16 敬老の日
10 2024/9/22 秋分の日
11 2024/9/23 休日
12 2024/10/14 スポーツの日
13 2024/11/3 文化の日
14 2024/11/4 休日
15 2024/11/23 勤労感謝の日
16 2025/1/1 元日
17 2025/1/13 成人の日
18 2025/2/11 建国記念の日
19 2025/2/23 天皇誕生日
20 2025/2/24 休日
21 2025/3/20 春分の日
行政機関の営業日数を求める
行政機関の休日は、土日祝日と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 日