1 編集前記・技術注記
本章では、このハンドブックの制作におけるアプローチの哲学、スタイル、具体的な編集上の留意項目について説明します。
1.1 アプローチとスタイル
本書の潜在的な読者層は広いと考えています。R を初めて使う人はもちろん、より良い R の使い方やそのヒントを探している経験豊富な R ユーザーにもきっと役立ててもらえるはずです。そのため、本書は理解しやすく、簡潔である必要があり、R に慣れていない人でもコードを適用し、コードが何をしているのかをたどることができるよう、十分な説明を行うことを心がけました。
その他のポイント
- 本書は、比較的簡単な事例を用いたコードの参考書であり、R やデータサイエンスの完全な教科書ではありません。
- 本書は、応用疫学で R を使用するためのハンドブックであり、応用疫学の手法や科学に関するマニュアルではありません。
- それぞれのタスクに最適な R のパッケージは頻繁に変わるため、このハンドブックでどのパッケージの使用を重視するかに関する議論を歓迎します。
R パッケージ
多くの選択肢
R の学習で最も難しいことの 1 つは、特定のタスクに対してどの R パッケージを使うべきかを把握することです。あるタスクで悪戦苦闘しているうちに、「あれ、1 つのコマンドで全部やってくれる R パッケージがあるじゃないか!」と気づくことはよくあります。
このハンドブックでは、各タスクを完了するために少なくとも 2 つの方法を用いるようにしています。1 つは試行錯誤を重ねた方法(おそらくbase R か tidyverse パッケージ)、もう 1 つはその目的のためにカスタマイズされた特別な R パッケージを使用する方法です。パッケージがダウンロードできない、あるいはうまく動作しない場合に備えて、いくつかの選択肢を用意しておきたいと思います。
使用するパッケージの選択にあたっては、一般的な利用者によってテストされ吟味されたもの、典型的な作業内で使用するパッケージの数が最小であるもの、安定しているもの(あまり頻繁に変更されない)、そしてシンプルかつ簡単にタスクを達成するパッケージと手法を優先的に選びました。
このハンドブックでは、一般的に tidyverse の R パッケージや関数を優先的に紹介します。tidyverse はデータサイエンスのために設計された複数の R パッケージを集めたものであり、含まれているパッケージは、基礎となる文法やデータ構造を共有しています。すべての tidyverse パッケージは、tidyverse パッケージを介してインストールまたは読み込むことが可能です。詳しくは tidyverse のウェブサイトをご覧ください。
また、本書の読者の中には、追加のパッケージをダウンロードするための信頼できるインターネット環境を利用できない方がいることを想定し、必要に応じて base R(R をインストールしたときに付属しているパッケージや関数)を用いた手法も紹介しています。
関数とパッケージの明示的な関連付け
R のチュートリアルで関数がコードで表示されても、それがどのパッケージのものかわからないとイライラすることがよくありますね! 私たちはこのような状況を避けようとしています。
本書では、説明する際にパッケージ名は太字で書き(例:dplyr)、関数は次のように書いています: mutate()
。また、関数がどのパッケージから来たものかを明示するために、文章内でパッケージを参照するか、dplyr::mutate()
のようにコード内でパッケージを明示するようにしています。冗長に見えるかもしれませんが、あえてそのように書いています。
パッケージや関数について詳しく知りたい方は、Rの基礎 の章をご覧ください。
コードのスタイル
このハンドブックでは、以下の理由に基づき、頻繁に「改行」をいれて、コードを「縦長」に表示しています。
- コードの細かい点について、コードのすぐ隣で
#
を使って説明コメントを書くことができる - 一般的に、長い(縦長の)コードの方が読みやすい
- 狭い画面でも読みやすい(横スクロールが必要ない)
- インデントにより、どの引数がどの関数に属しているかがわかりやすい
以下に例を挙げます。
linelist %>%
group_by(hospital) %>% # 病院ごとのグループの列
slice_max(date, n = 1, with_ties = F) # 日付が同じ場合は最初の行を採用する
本書のスタイルに従うと、上のコードは、次のように書きます。
linelist %>%
group_by(hospital) %>% # 病院ごとのグループの列
slice_max(
date, # グループごとに日付の最大値を持つ行を保持する
n = 1, # 最も上段の 1 列を保持する
with_ties = F) # 日付が同じ場合は最初の行を採用する
R コードは通常、改行やインデントの影響を受けません。コードを書く際は、カンマの後で改行すると、自動的なインデントが適用されます。
また、スペースをたくさん使っている理由は、その方が読みやすいからです(例えば、n=1
ではなく n = 1
)。読み手に親切なコードを書きましょう!
用語解説
このハンドブックでは、一般的に「変数(variables)」や「観測値(observations)」ではなく「列(columns)」や「行(rows)」といった用語を使用します。この 「tidy data(データの前処理)」 の入門書で説明されているように、ほとんどの疫学統計データセットは、行(rows)、列(columns)、値(values)の構造で構成されています。
変数には、同じ基本属性(年齢層、転帰、発症日など)を測定した値が含まれます。観測値には、同じ単位(人、部位、実験試料など)で測定されたすべての値が含まれます。したがって、列や行と比較して、これらを具体的に定義することは困難であるでしょう。
「整理された」データセットでは、各列が変数、各行が観測値、各セルが 1 つの値です。しかし、あなたが扱うデータセットの中には、この型に当てはまらないものもあります。例えば、「横長」形式のデータセットでは、変数が複数の列にまたがっていることがあります(データの縦横変換 の章で例をご覧ください)。同様に、観測値も複数の行にまたがって分割されていることもあります。
このハンドブックの大部分は、データの管理と変換に関するものなので、抽象的な観測値や変数よりも、行や列といったより具体的なデータ構造に言及する方が適切です。例外は主にデータ解析の章で生じ、そこでは変数や観測値への言及が多くなります。
1.2 編集上の決定事項
以下では、パッケージや関数の選択に関して、編集上の重要な決定事項を記載しています。これらについて異なる意見がある場合や、新しいツールをご提供いただける場合は、こちらの Github ページに参加しメッセージをお送りください。
パッケージ、関数、その他の編集上の決定事項の表
項目 | 候補パッケージ・関数 | 推奨パッケージ・関数 | 簡単な説明 |
---|---|---|---|
一般的なコーディング方法 | tidyverse, data.table, base | tidyverse、data.table 関連の章で使用される。インターネットを持たない読者のための代替方法としては base を推奨 | tidyverse 読みやすいコードや一般性の高いコードの作成のために使用される(一番教えられているパッケージ |
パッケージの読み込み |
library() ,install.packages() , require() , pacman
|
pacman | ほとんどのパッケージのインストールと読み込みにおいて、コードの短縮と簡素化を実現する |
インポートとエクスポート | rio, 他にも多数存在 | rio | 多くのファイルタイプに対応する手軽さ |
要約統計のためのグループ化 |
dplyr group_by() , stats aggregate()
|
dplyr group_by()
|
tidyverse と同様に重要 |
縦横変換 | tidyr (pivot 系関数), reshape2 (melt/cast), tidyr (spread/gather) | tidyr (pivot 系関数) | reshape2 は廃止され、tidyr は 1.0.0 版から pivot 系関数を使用 |
列名のクリーニング | linelist, janitor | janitor | パッケージの集約を重視 |
時間データの取り扱い | lubridate, aweek, tsibble, zoo | lubridate 一般的なものと、特定のケースに対応するものとがある | lubridate の柔軟性、一貫性、パッケージ維持の見通し |
ggplot ラベル |
labs() , ggtitle() /ylab() /xlab()
|
labs() |
すべてのラベルを一箇所でシンプルに修正 |
因子型への変換 |
factor() , forcats
|
forcats | さまざまな関数も同じコマンドで因子に変換 |
流行曲線(エピカーブ) | incidence, ggplot2, EpiCurve | incidence2 を素早く、ggplot2 を詳細に | 信頼性 |
結合処理 |
paste() , paste0() , str_glue() , glue()
|
str_glue() |
stringr 内にあり paste 関数よりもシンプルな構文 |
1.3 主な修正履歴
日付 | 主な変更点 |
---|---|
2021 年 5 月 10 日 | 1.0.0 版の公開 |
2022 年11 月 20 日 | 1.0.1 版の公開 |
更新情報 1.0.1 版は以下の変更が適用されています。
- R のバージョンを 4.2 に更新しました
- データクリーニングと主要関数 : {linelist} パッケージから {matchmaker} パッケージへの変更、
case_when()
の例示コードから不溶な行を削除 - 日付型データ : {linelist} パッケージの関数
guess_date()
から {parsedate} パッケージの関数parse_date()
への変更 - データの縦横変換 :
pivot_wider()
のid_cols=
引数の小変更 - 標本調査データ分析 :
plot_age_pyramid()
からage_pyramid()
への変更、サンキー図(沖積図)をプロットするコードの小変更 - ヒートマップ :
agg_weeks
オブジェクト生成コードにungroup()
を追加 - 動的な図の作成 :
agg_weeks
オブジェクト作成時にtidyr::expand()
が意図通りに機能するためにungroup()
を追加 - 時系列分析とアウトブレイクの検出 : すべての
trending::fit()
とpredict()
内のオブジェクトに対してdata.frame()
を追加 - 複数回答データの分析 :
case_when()
からifelse()
への変更、データオブジェクト作成時にacross()
引数を追加 - 感染連鎖 : より新しいバージョンの {epicontacts} パッケージを利用するように変更
1.4 バージョン情報 (R・RStudio・パッケージ)
このハンドブックで使用した R、RStudio、R パッケージのバージョンに関する情報を以下に示します。
sessioninfo::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R version 4.3.2 (2023-10-31)
## os Ubuntu 22.04.3 LTS
## system x86_64, linux-gnu
## ui X11
## language (EN)
## collate en_US.UTF-8
## ctype en_US.UTF-8
## tz Etc/UTC
## date 2023-12-28
## pandoc 3.1.1 @ /usr/local/bin/ (via rmarkdown)
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## ! package * version date (UTC) lib source
## BiocManager 1.30.22 2023-08-08 [1] CRAN (R 4.3.2)
## bookdown 0.37 2023-12-01 [1] CRAN (R 4.3.2)
## bslib 0.6.1 2023-11-28 [1] CRAN (R 4.3.2)
## cachem 1.0.8 2023-05-01 [1] CRAN (R 4.3.2)
## cli 3.6.2 2023-12-11 [1] CRAN (R 4.3.2)
## colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.2)
## data.table 1.14.10 2023-12-08 [1] CRAN (R 4.3.2)
## digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.2)
## downlit 0.4.3 2023-06-29 [1] CRAN (R 4.3.2)
## dplyr * 1.1.4 2023-11-17 [1] CRAN (R 4.3.2)
## DT * 0.31 2023-12-09 [1] CRAN (R 4.3.2)
## evaluate 0.23 2023-11-01 [1] CRAN (R 4.3.2)
## fansi 1.0.6 2023-12-08 [1] CRAN (R 4.3.2)
## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.2)
## forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.2)
## fs 1.6.3 2023-07-20 [1] CRAN (R 4.3.2)
## generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.2)
## ggplot2 * 3.4.4 2023-10-12 [1] CRAN (R 4.3.2)
## glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.2)
## grates 1.1.0 2023-06-08 [1] CRAN (R 4.3.2)
## gtable 0.3.4 2023-08-21 [1] CRAN (R 4.3.2)
## here * 1.0.1 2020-12-13 [1] CRAN (R 4.3.2)
## highr 0.10 2022-12-22 [1] CRAN (R 4.3.2)
## hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.2)
## htmltools 0.5.7 2023-11-03 [1] CRAN (R 4.3.2)
## htmlwidgets 1.6.4 2023-12-06 [1] CRAN (R 4.3.2)
## incidence2 2.2.3 2023-12-05 [1] CRAN (R 4.3.2)
## janitor 2.2.0 2023-02-02 [1] CRAN (R 4.3.2)
## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.3.2)
## jsonlite 1.8.8 2023-12-04 [1] CRAN (R 4.3.2)
## knitr 1.45 2023-10-30 [1] CRAN (R 4.3.2)
## lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.3.2)
## lubridate * 1.9.3 2023-09-27 [1] CRAN (R 4.3.2)
## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.2)
## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.3.2)
## munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.2)
## P pacman 0.5.1 2019-03-11 [?] CRAN (R 4.3.2)
## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.2)
## pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.2)
## purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.2)
## R.methodsS3 1.8.2 2022-06-13 [1] CRAN (R 4.3.2)
## R.oo 1.25.0 2022-06-12 [1] CRAN (R 4.3.2)
## R.utils 2.12.3 2023-11-18 [1] CRAN (R 4.3.2)
## R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.2)
## readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.2)
## renv 1.0.3 2023-09-19 [1] CRAN (R 4.3.2)
## rio * 1.0.1 2023-09-19 [1] CRAN (R 4.3.2)
## rlang 1.1.2 2023-11-04 [1] CRAN (R 4.3.2)
## rmarkdown 2.25 2023-09-18 [1] CRAN (R 4.3.2)
## rprojroot 2.0.4 2023-11-05 [1] CRAN (R 4.3.2)
## rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.2)
## sass 0.4.8 2023-12-06 [1] CRAN (R 4.3.2)
## scales 1.3.0 2023-11-28 [1] CRAN (R 4.3.2)
## sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.2)
## snakecase 0.11.1 2023-08-27 [1] CRAN (R 4.3.2)
## stringi 1.8.3 2023-12-11 [1] CRAN (R 4.3.2)
## stringr * 1.5.1 2023-11-14 [1] CRAN (R 4.3.2)
## tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.2)
## tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.2)
## tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.2)
## tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.2)
## timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.2)
## tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.2)
## utf8 1.2.4 2023-10-22 [1] CRAN (R 4.3.2)
## vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.3.2)
## withr 2.5.2 2023-10-30 [1] CRAN (R 4.3.2)
## xfun 0.41 2023-11-01 [1] CRAN (R 4.3.2)
## xml2 1.3.6 2023-12-04 [1] CRAN (R 4.3.2)
## yaml 2.3.8 2023-12-11 [1] CRAN (R 4.3.2)
##
## [1] /opt/epiRhandbook_jp/renv/library/R-4.3/x86_64-pc-linux-gnu
## [2] /root/.cache/R/renv/sandbox/R-4.3/x86_64-pc-linux-gnu/25ebdc09
##
## P ── Loaded and on-disk path mismatch.
##
## ──────────────────────────────────────────────────────────────────────────────