準備
データの操作と視覚化のために tidyverse パッケージを読み込む.
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.1 ✔ stringr 1.5.2
✔ ggplot2 4.0.0 ✔ tibble 3.3.0
✔ lubridate 1.9.4 ✔ tidyr 1.3.1
✔ purrr 1.1.0
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Quartoファイルの中で使われているパッケージがインストールされていない場合は, エディタ上部にインストールを促す警告が出るので,その指示に従ってインストールすればよい. 手動でインストールする場合は以下のいずれかを実行する.
- Package タブからインストール
- コンソール上で次のコマンドを実行
install.packages("パッケージ名")
tidyverse は第1講のサンプルで使っているので通常はインストールされているが, R言語のバージョンがアップグレードされた場合などに対応が必要となる.
library(tidyverse) を実行すると読み込まれたパッケージが表示される. 同名の関数が存在する場合には Conflicts として衝突する関数名が表示される. 衝突する場合はパッケージ名を明示的に付ける必要がある. 例えば filter() には以下の2つがある.
dplyer::filter() データフレームの抽出のための関数
stats::filter() 時系列処理のための線形フィルタ関数
名前の衝突による不具合を避けたい場合は conflicted パッケージの利用を推奨する.
データフレームの作成
データフレームは 同じ長さのベクトル(関数 base::c() で作成)を関数 tibble::tibble() に渡して作成する.
#' (... <- ...) は代入した結果を表示
(foo <- tibble(one = c(1,2,3),two = c("AB","CD","EF")))
(bar <- tibble(three = c("x","y","z"),four = c(0.9,0.5,-0.3)))
データフレームを結合するには関数 dplyr::bind_cols() を用いる.
(baz <- bind_cols(foo,bar))
問題
次の表に対応するデータフレームを作成しなさい.
| Alice |
90 |
25 |
65 |
70 |
| Bob |
80 |
50 |
100 |
50 |
| Carol |
70 |
75 |
70 |
30 |
| Dave |
60 |
100 |
40 |
80 |
| Eve |
50 |
80 |
75 |
100 |
ファイルの読み書き
ファイルの書き出しには関数 readr::write_csv() を用いる.
write_csv(x, file = "ファイル名") # データフレームxをファイルに書き出す
ファイルの読み込みには関数 readr::read_csv() を用いる.
y <- read_csv(file = "ファイル名") # 変数yにCSVファイルの内容を読み込む
問題
以下の問いに答えなさい.
- 前の演習で作成したデータフレームを適当なファイルに書き出しなさい.
- 書き出したファイルから別の変数に読み込みなさい.
pcr_case_daily.csv (厚労省からダウンロードしたファイル)を変数 pcr_data に読み込みなさい.
データフレームの操作
行の選択には関数 dplyer::filter() を, 列の選択には関数 dplyer::select() を用いる.
#' 前に作成したデータフレーム z を用いた例
(foo <- filter(z, three >= 7)) # 列 three の値が7以上の行を選択
(bar <- select(foo, c(one, three))) # 列 one,three を選択
#' パイプを用いると以下のように簡潔に書ける
z |> filter(three >= 7) |> select(one, three)
問題
pcr_case_daily.csv から以下の条件を満たすデータを取り出しなさい.
- 医療機関 (mi) での検査件数が2000を越えたときの国立感染症研究所 (niid) と医療機関 (mi) のデータ.
- 大学等 (univ) と医療機関 (mi) でともに検査件数が2000を越えたデータ.
- 2020年3月の各機関(sub,total は集計なので除く)の検査件数データ.
データフレームの集約
列の集計には関数 dplyr::summarise() を用いる.
#' 練習問題のデータフレームを用いた例
grade_data |>
summarise(math_mean = mean(math), nums = n()) # 数学の平均を求める
#' 複数の列にまたがる操作には関数 dplyr::across() を利用
grade_data |>
summarise(across(!name, mean)) # 名前の列以外の平均を求める
集計に必要な関数が用意されていない場合は, 無名関数として定義して利用すれば良い.
問題
pcr_case_daily.csv について以下の集計を行いなさい.
- 各機関でのPCR検査件数の最大値.
- 2021年の各機関でのPCR検査件数の月ごとの最大値.
ヘルプを用いて datasets::mtcars の内容を調べた上で以下の集計を行いなさい.
- 気筒数 (cyl) ごとに排気量 (disp) の最大値,最小値.
- 気筒数 (cyl) とギア数 (gear) ごとの燃費 (mpg) の平均値.
基本的なグラフの描画
グラフの描画には 関数 ggplot2::ggplot() で描画に用いるデータフレームを指定し, 描きたいグラフの種類に応じて関数 ggplot2::geom_XXX() を加える.
pcr_data |> # パイプ演算子でデータフレームを関数 ggplot2::ggplot() に渡す
ggplot(aes(x = date)) + # date をx軸に指定
geom_line(aes(y = ai), colour = "blue") + # 行政検査を青
geom_line(aes(y = mi), colour = "red") + # 医療機関を赤
labs(y = "number of tests") # y軸のラベルを変更
散布図行列を描くには関数 GGally::ggpairs() を用いると良い.
library(GGally)
pcr_data |>
select(!c(date,sub,total)) |> # 日付と集計値を除いて必要なデータフレームに整形
ggpairs() # 標準の散布図行列
問題
pcr_case_daily.csv を用いて以下の描画を行いなさい.
- 検疫所 (b),地方衛生研究所.保健所 (c),民間検査会社 (d) における検査件数の推移.
- 民間検査会社 (d),大学等 (e),医療機関 (f) での検査件数の関係 (散布図).
擬似乱数
問題
ヘルプを用いて以下の関数を調べよ.
- 関数
base::sample()
- 関数
stats::rbinom()
- 関数
stats::runif()
- 関数
stats::rnorm()
- 関数
base::set.seed()
以下の試行を実装してみよ.
- サイコロを10回振る.
- 4枚のコインを投げたときの表の枚数.
双六ゲーム
問題
以下の簡単な双六ゲームを考える.
- ゴールまでのます目は100とする.
- さいころを振り出た目の数だけ進む.
- ゴールに辿り着くまで繰り返す.
さいころを振る回数の分布がどうなるか実験を行いなさい.