3 R の基礎

ようこそ!

この章では、R の要点をおさらいします。本章は、包括的なチュートリアルを意図するものではなく、R に関する基礎知識を提供し、あなたの記憶をリフレッシュすることを意図しています。後述の 参考資料 のセクションには、より包括的なチュートリアルへのリンク集があります。

この章の一部は、権利者の承諾を得て、R4Epis project を元に作成されています。

STATA、SAS、もしくは Excel から R への移行に関するヒントは、Excel・Stata・SASとの比較 の章を参照してください。

3.1 なぜ R を使うのか?

こちらの R プロジェクトのウェブサイト で述べられているように、R はプログラミング言語であり、統計的機械計算と視覚化のための環境を提供します。R は、汎用性や拡張性が非常に高く、また、コミュニティ手動の開発も行われています。

R の費用

R は無料で利用できます! この点においては、自由かつオープンソースを志向する人々のコミュニティにおける、強固な倫理的矜持があります。

再現性

プログラミング言語を使用して行うデータ管理と分析は、(Excel や、カーソルを動かしてクリックしたり、手作業で管理するツールに比べて)、再現性を高めると共に、エラーの発見を容易にし、作業の負荷を軽減します。

コミュニティ

R には、大きなユーザーのコミュニティがあり、協同的です。現実世界の問題を扱う新しいパッケージやツール群が日々開発されており、ユーザーコミュニティで検証されています。コミュニティの 1 つの例として、R-Ladies は、R コミュニティでのジェンダーダイバーシティの推進をミッションとした世界的な組織です。また、大規模な R ユーザーコミュニティの 1 つでもあります。このコミュニティの支部はおそらくあなたの住んでいる場所の近くにもあるでしょう。

3.2 キーワード

RStudio:RStudio は、R をより使いやすくするグラフィカルインタフェース(Graphical User Interface; GUI)です。詳しくは、後述の RStudio のセクション を参照してください。

オブジェクト:あなたが R に保存するすべて(データセット、変数、町の名前のリスト、合計人口や、グラフのようなアウトプットでさえも)は、名前が割り当てられかつ、以降のコマンドで参照可能なオブジェクトです。詳しくは、後述の オブジェクトのセクション を参照してください。

関数:関数とは、入力を受け入れて処理し、処理され変化した内容を出力して返すコードのことをいいます。詳しくは、後述の 関数のセクション を参照してください。

パッケージ:R パッケージは、複数の関数をまとめて共用可能にしたものです。詳しくは、後述の パッケージのセクション を参照してください。

スクリプト:スクリプトとは、R のコマンドが書かれたドキュメントファイルです。詳しくは、後述の スクリプトのセクション を参照してください。

3.3 参考資料

RStudio に含まれているリソース

ヘルプドキュメント

R パッケージや特定の関数のドキュメントについては、RStudio の “Help” タブをまず見つけてください。このタブは、Files、Plots、Packages タブを含むペインに含まれています(一般的には右下のペインにあります)。ショートカットとして、R コンソールに、クエスチョンマークに続けて、パッケージや特定の名前を入力しても関連するヘルプページを表示することができます。括弧()は入力に含めないでください。

例えば、?filter や、?diagrammeR というように入力します。

インタラクティブチュートリアル

R を学ぶ方法として、RStudio 内でインタラクティブに(コードを実際に書きながら)学ぶ方法がいくつかあります。

まず、RStudio 自体が learnr パッケージを使ったチュートリアルペインを提供しています。このパッケージをインストールし、RStudio の右上に新たに現れる “Tutorilal” タブを開くだけで始められます。(この右上のペインは、Environment、History タブも含みます)。

また、swirl というパッケージは、R コンソールで体験的に学習できるコースを提供します。このパッケージをインストール後読み込み、そのあと、swirl() (空括弧をつけます)コマンドを R コンソール上で実行します。プロンプトがコンソール上に現れ、コンソール上での入力に反応します。あなたが選択したコースを通して、このプロンプトがガイドします。

チートシート

RStudio ウェブサイト 上には、多くの「チートシート(PDF ファイル)」があります。例えば、

  • forcats パッケージと因子(ファクタ)型
  • lubridate パッケージと日時型
  • stringr パッケージと文字型
  • purrr パッケージと反復操作
  • データのインポート
  • dplyr パッケージとデータ変換
  • R Markdown(PDF, Word, Powerpoint のような文書を作るために)
  • Shiny(インタラクティブなウェブアプリを作るために)
  • ggplot2 パッケージとデータ視覚化
  • 地図の作成(GIS)
  • leaflet パッケージ(インタラクティブな地図の作成)
  • R とともに使う Python(reticulate パッケージ)

また、こちら には Excel ユーザー のための R リソースもあります。

Twitter

R には活発なコミュニティがあり、役に立つヒントやショートカット、更新情報などを知ることができます。以下のアカウントをフォローしてください。

そして、

#epitwitter#rstats のハッシュタグもチェックしてみてください!

無料のオンラインリソース

最も信頼できる書籍は、Garrett Grolemund と Hadley Wickham による R for Data Science です。

R4Epis プロジェクトのウェブサイトは、「国境なき医師団(MSF)で緊急事態発生時に実施される一般的なアウトブレイク調査をサポートするために、標準化されたデータクリーニング、データ分析、およびレポート作成ツールを開発する」ことを目的にしています。ウェブサイトでは、R の基本的な資料、アウトブレイクと疫学調査に関する RMarkdown レポートのテンプレート、また、環境設定に役立つチュートリアルを閲覧することができます。

3.4 インストール

R と RStudio

R のインストール方法

https://www.r-project.org/ のウェブサイトを開き、使用するコンピュータに応じて、R の最新バージョンをダウンロードしてください。

RStudio のインストール方法

https://rstudio.com/products/rstudio/download/ のウェブサイトを開き、使用するコンピュータに応じて、RStudio の最新バージョンをダウンロードしてください。

アクセス許可

R と RStudio は、読み取りと書き込みのアクセス許可があるディスクドライブにインストールする必要があることに注意してください。 そうしないと、R パッケージをインストールする際に影響を受けます(R パッケージのインストールは頻繁に必要になります)。 アクセス許可に関して問題が発生した場合は、アイコンを右クリックして「管理者として実行(Run as administrator)」を選択し、RStudio を開いてみてください。 その他の対処法は、ネットワークドライブで R を使用する場合 の章を参照してください。

R と RStudio のアップデート方法

R のバージョンは、起動時に R コンソールに出力されます。 または、sessionInfo() を実行しても確認できます。

R のアップデートは、先述のウェブサイトにアクセスして、R を再インストールします。または、(Windows の場合は)installr パッケージを使用し、installr::updateR() を実行してもアップデートできます。 このコマンドを実行すると、最新バージョンの R がダウンロードされ、最新バージョンに対応してパッケージをアップデートするためのダイアログボックスが開きます。 詳細については、instrallrドキュメント を参照してください。

R をアップデートしても、古いバージョンの R がまだコンピュータ上に存在することに注意してください。 RStudio で “Tools” -> “Global Options” をクリックし、R の古いバージョンを選択することで、R の古いバージョン(古い「インストール済み」のバージョン)を一時的に実行できます。 この操作は、最新バージョンの R で動作するようにアップデートされていないパッケージを使用する場合に役立ちます。

RStudio をアップデートするには、上記のウェブサイトにアクセスして、RStudio を再ダウンロードします。 他の方法として、RStudio 内の “Help” -> “Check for Updates” をクリックすることもありますが、この方法では最新のアップデートが表示されない場合があります。

このハンドブックの作成時に使用された R、RStudio、またはパッケージのバージョンを確認したい場合は、編集前記・技術注記 の章を参照してください。

おそらくインストールが必要となるその他のソフトウェア

  • TinyTeX (RMarkdown ドキュメント を PDF ファイルへ変換するため)
  • Pandoc (RMarkdown ドキュメントを変換するため)
  • RTools (R パッケージの開発のため)
  • phantomjs (感染連鎖図のような、動きのあるネットワークの静止画の保存のため)

TinyTex

TinyTex は カスタム化された LaTeX の 1 つです。R から PDF を作成したい場合に便利です。より詳しい情報は、https://yihui.org/tinytex/ をご覧ください。

TinyTex を R コンソールでインストールするには、以下のコマンドを実行してください。

install.packages('tinytex')
tinytex::install_tinytex()
# TinyTex をアンインストールする場合, tinytex::uninstall_tinytex() を実行する

Pandoc

Pandoc は、ドキュメント変換ツールであり、R とは切り離されたソフトウェアです。RStudio をインストールした際に同時にインストールされるので、個別にダウンロードする必要はありません。Rmarkdown ドキュメントを .pdf に変換したり、複雑な機能を追加してくれたりします。

RTools

RTools は、R のパッケージを開発するためのソフトウェアをまとめたものです。

以下のウェブサイトからインストールしてください。

https://cran.r-project.org/bin/windows/Rtools/

phantomjs

phantomjs は、ウェブページの「スクリーンショット」を取得するためによく使われるパッケージです。例えば、epicontacts パッケージで感染連鎖の図を作成する際、インタラクティブかつ動的な HTML ファイルが生成されます。静的な画像が必要な場合は、この作業を自動化するために webshot パッケージを使うと便利であり、このような自動化には、“phantomjs” という外部プログラムが必要です。phantomjs は webshot パッケージの webshot::install_phatomjs() を実行すると、インストールできます。

3.5 RStudio

RStudio オリエンテーション

まず最初に、RStudio をたちあげます。 R とアイコンが非常に似ているので、R ではなく RStudio を開くことを確認してください。

RStudio が動作するためには、R もインストールされている必要があります(先述のインストールのセクションを参照してください)。

RStudio は、R を簡単に使用するためのインタフェース(GUI)です。R を車のエンジン、つまり重要な働きを行っている部分と例えるならば、RStudio は、車の車体(シートやアクセサリなど)、つまりあなたがエンジンを動かすために使うものと考えることができます!RStudio ユーザインタフェースのチートシートは こちら で参照いただけます。

デフォルトでは、RStudio には 4 つの四角いペインがあります。

ヒントの: もし RStudio の左側に 1 つしかペインが表示されていない場合は、まだ R スクリプトを 1 つも開いていないからです。

Source ペイン

デフォルトでは左上に表示されるこのペインは、スクリプト の編集、実行、保存に使うスペースです。スクリプトは、実行コマンドを含んでいます。このペインには、データセット(データフレーム)を表示させることもできます。

Stata ユーザには、このペインは Do-file and Data Editor ウィンドウのように見えるでしょう。

R Console ペイン

RStudio でデフォルトで左下に表示される R コンソールは、R の「エンジン」に相当します。コマンドを実際に実行したり、グラフィックでない出力結果やエラー、または警告メッセージが表示されます。R コンソールに直接コマンドを入力し、実行することができますが、スクリプト上でコマンドを実行したときと違い、コンソールから実行したコマンドは保存されないことを覚えておいてください。

Stata に慣れている方にとっては、R コンソールは Command ウィンドウや Results ウィンドウに似ています。

Environment ペイン
デフォルトで右上に表示されるこのペインでは、現在のセッションにおける R 環境の オブジェクト の簡単な要約としてよく利用されます。オブジェクトは、インポート、変更、または生成されたデータセット、定義したパラメータ(例えば、分析の特定の疫学週)、または分析中に定義したベクトルまたはリスト(例えば、地域の名前)などが含まれます。データフレーム名の横にある矢印をクリックすると、データフレームに含まれている変数を確認できます。

Stata では、Variables Manager ウィンドウに最もよく似ています。

このペインには、過去に実行したコマンドを閲覧できる History タブもあります。もし learnr パッケージをインストール済みであれば、インタラクティブな R チュートリアルを行う “Tutorial” タブもこのペインにあります。また、外部接続のための “Connections” ペインと、Github インタフェースを選択した場合に “Git” タブもあります。

Plots、Viewer、Packages と Help ペイン
右下にあるペインはいくつかの重要なタブを含んでいます。地図などの図をプロットした際の出力結果は、Plot ペインに表示されます。インタラクティブ出力や、HTML 出力は Viewer ペインに表示されます。Help ペインはドキュメントやヘルプファイルを表示することができます。Files ペインは、ファイルを開いたり削除したりするために使われるブラウザです。Package ペインでは、R パッケージのインストール、アップデート、削除、読み込みと破棄(ロードとアンロード)が可能です。また、どのバージョンのパッケージがインストール済みかも確認することができます。R パッケージについてより詳しく知りたい方は、後述の パッケージセクション を参照してください。

このペインは、Stata の Plots Manager と Project Manager ウィンドウに相当する機能が含まれます。

RStudio の設定

Tools ドロップダウンメニューにある Global Options を選択し、RStudio の設定や外観の変更します。外観や、背景の色などのデフォルトの設定を変更することができます。

再起動

R が固まって動かなくなった場合、Session メニューの “Restart R” をクリックすることで R を再起動することができます。RStudio を閉じたり開いたりする手間を省くことができ、この操作を実行した場合は、現在の R 環境のすべてが削除されます。

キーボード ショートカット

便利なキーボード ショートカットをいくつか以下に示します。Windows、Max、Linux のすべてのキーボード ショートカットを参照する場合は、RStudio ユーザインタフェースチートシート の 2 ページ目を参照してください。

Windows/Linux Mac 動作
Esc Esc 現在実行中のコマンドを中断する(誤って未完成のコマンドを実行してしまった場合や、R コンソール内に “+” が見えている状態でエスケープできない場合に有用)
Ctrl+s Cmd+s スクリプトを保存する
Tab Tab 自動補完する
Ctrl + Enter Cmd + Enter 現在の行または、選択したコードを実行する
Ctrl + Shift + C Cmd + Shift + c ハイライトされた行をコメント化する、またはコメントでない状態に戻す
Alt + - Option + - <- を挿入する
Ctrl + Shift + m Cmd + Shift + m %>% を挿入する
Ctrl + l Cmd + l R コンソールの表示をクリアにする
Ctrl + Alt + b Cmd + Option + b 第一行から現在行まで実行する
Ctrl + Alt + t Cmd + Option + t 現在のコードセクションを実行する(R Markdown)
Ctrl + Alt + i Cmd + Shift + r コードチャンクを挿入する(R Markdown 内へ)
Ctrl + Alt + c Cmd + Option + c 現在のコードチャンクを実行する(R Markdown)
R コンソール内での 上下 矢印キー 同左 最近実行したコマンドを切り替える
スクリプト内で Shift + 上下矢印キー 同左 複数行の選択
Ctrl + f Cmd + f 現在のスクリプト内の検索と置き換え
Ctrl + Shift + f Cmd + Shift + f ファイルをまたいだ検索(複数のスクリプトをまたいだ検索・置き換え)
Alt + l Cmd + Option + l 選択したコードの折りたたみ
Shift + Alt + l Cmd + Shift + Option+l 選択したコードの展開

ヒントRStudio の自動補完機能を使用したい場合は、入力時に Tab キーを押してください。スペルミスによるエラーを防ぐことができます。入力中に Tab キーを押すことで、これまでに入力した内容に基づき、入力する可能性のある関数とオブジェクトのドロップダウンメニューが表示されます。

3.6 関数

関数は R を使う上で核となるものです。関数は、タスクや操作を実行する方法が定義されたものです。R のインストールには多くの関数が含まれていますが、加えて個別にパッケージをダウンロードすると、さらに多くの関数が利用可能です(詳しくは、後述のパッケージ セクションで説明します)。また、ご自身でカスタム関数を定義することもできます。

関数についてこの基礎的なセクションで説明することは、以下の項目です。

  • 関数とは何か、どのように機能するか
  • 関数の引数とは何か
  • 関数を理解するために使えるリソース

このハンドブックにおけるコードの書き方について:このハンドブックでは、関数は filter() のように括弧つきのスタイルで書かれています。後述の パッケージ のセクションで説明されているように、関数はパッケージに含まれており、パッケージとともにダウンロードされます。このハンドブックでは、パッケージの名前は dplyr のように太字で書かれています。サンプルコードでは、ときおり dplyr::filter() のように、関数名をパッケージ名と 2 つのコロン(::)でつなげている場合があります。この記法の目的は、後述の パッケージ のセクションで説明します。

単純な関数

関数とは、入力を受付け、入力に基づいて動作し、出力を生成する機械のようなものです。 出力が何であるかは関数に依存します。

関数は通常、関数の括弧内に書かれた何らかのオブジェクトに対して動作します。 例えば、sqrt() は、数値の平方根を計算します。

sqrt(49)
## [1] 7

関数に渡されるオブジェクトには、データセットの列を指定することもできます(すべての種類のオブジェクトの詳細については、後述の オブジェクト セクションを参照してください)。R は複数のデータセットを格納できるため、オブジェクトを指定する際は、データセット名と列の両方を明記する必要があります。1 つの方法は、$ 表記を使用して、データセット名と列名をつなげることです(例えば、dataset$column)。以下の例では、lineliset データセット内の数値を含む列である age 列に summary() を適用し、age 列の要約統計量を算出し、出力しています。

# `linelist` データセットの `age` 列の要約統計量を出力
summary(linelist$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.00    6.00   13.00   16.07   23.00   84.00      86

注釈関数の実行を裏から見ると、関数とは複雑なコードをユーザーが簡単に使えるように 1 つのコマンドにまとめたものです。

複数の引数を取る関数

関数は、たいてい引数と呼ばれる複数の入力を要求します。引数は関数の括弧内にあり、通常はコンマで区切られています。

  • 関数が正しく機能するために必須な引数もありますが、任意の引数もあります
  • 任意の引数は、デフォルトの値を持っています
  • 文字列、数値、ロジカル値(TRUE/FALSE)、更に他の型の入力を引数に取ることができます

典型的な関数の例として、oven_bake() という架空の関数を考えます。入力オブジェクト(データセット、この例では「パンとなる生地(dough)」)を受け取り、追加の引数(minutes =temperature =)で指定された操作を実行します。出力結果はコンソールに表示するか、代入演算子 <- を使用してオブジェクトとして保存できます。

より現実的な例として、以下の age_pyramid() コマンドでは、定義された年齢グループと、genger 列のような二値分類された列に基づいて、年齢ピラミッドをプロットします。関数には、括弧内にコンマで区切られた 3 つの引数が与えられます。それぞれの引数には、プロットするデータフレームとして linelist を、カウントする列として age_cat5 を、ピラミッドの色分けに使用する列として二値分類列である gender を指定します。

# 年齢層別の人口ピラミッドを作成する
age_pyramid(data = linelist, age_group = "age_cat5", split_by = "gender")

上で書いたコマンドは、以下のように、引数ごとに改行した長い書式で書くことができます。この書式は読みやすく、各部分を説明するための「コメント」を # を使って簡単に書くことができます。(コメントを多く残すことは良い習慣です!)以下のような長いコマンドを実行するには、コマンド全体をハイライトして “Run” をクリックするか、最初の行にカーソルを合わせて、 Ctrl キーと Enter キーを同時押すだけです。

# 年齢層別の人口ピラミッドを作成する
age_pyramid(
  data = linelist,        # 症例ラインリストを使用
  age_group = "age_cat5", # 年齢層の列を指定
  split_by = "gender"     # ピラミッドの両翼に、性別列を使用
  )

引数が特定の順序で記述されている場合(関数のドキュメントで指定されている場合)は、引数の代入部分の前半(data = など)を書く必要はありません。以下のコードでは、データフレーム、age_group 変数、spilit_by 変数という引数の順序を関数が予測しているため、上で書いたコマンドとまったく同じピラミッドを作成します。

# このコマンドは前述のピラミッドとまったく同じものを作成する
age_pyramid(linelist, "age_cat5", "gender")

より複雑な age_pyramid() コマンドには、以下のような任意の引数が含まれます。

  • カウント数の代わりに割合を表示したい場合(デフォルトは、FALSE ですが、proportional = TRUE と設定します)

  • 両翼それぞれの色を指定したい場合(pal = は、“palette” の略で、2 つの色名のベクトル型として渡されます。c() 関数でベクトル型を作成する方法については、後述の オブジェクト のセクションを参照してください)

注釈引数名と値の両方の部分を指定した場合(例:proportional = TRUE)は、指定された引数の順序は問題になりません。

age_pyramid(
  linelist,                    # 症例ラインリストを使用
  "age_cat5",                  # 年齢層別
  "gender",                    # 性別で分類
  proportional = TRUE,         # カウント数に代わり割合を表示
  pal = c("orange", "purple")  # 色の指定
  )

関数を作成する

R は関数志向のプログラミング言語であるため、自分で関数を書くことができるようになっています。関数を作成すると以下のような利点があります。

  • モジュール化(modular programming; コードを、独立した管理可能な部分に分離すること)を促進します
  • エラーが発生しやすい、コピー&ペーストの繰り返しを解消します
  • コードに覚えやすい名前をつけられます

関数の書き方については、関数の作成 の章で詳しく説明しています。

3.7 パッケージ

パッケージには、関数が含まれています。

R パッケージとは、あらかじめ定義された関数を含む、コードとドキュメントをまとめた共用可能なまとまりです。R コミュニティのユーザーは、特定の問題に対応したパッケージを常に開発しており、その特化して開発されたパッケージがあなたの業務に役立つ可能性があります!実際にR を使用する際には、何百ものパッケージをインストールして活用することになります。

R のインストール時には、基本的な作業を実行する base パッケージ(以下、base R)と関数が含まれています。しかし、多くの R ユーザーが特殊な関数を作成しており、それらは R コミュニティによって検証され、あなたが使用するためにパッケージとしてダウンロードすることができます。このハンドブックでは、パッケージ名を太字で表記しています。R の使用にあたって難しく感じる点の 1 つは、ある作業を行うために選択できる関数またはパッケージが、多数あることです。

インストールと読み込み

関数は、インターネットを通じてコンピュータにダウンロード(「インストール」)できるパッケージに含まれています。パッケージがダウンロードされると、「ライブラリ」に保存されます。その後、パッケージを「読み込む」ことで、実行中の R セッションが閉じられるまで、読み込んだ関数にアクセスすることができます。

R を個人用のライブラリ(図書館)と捉えてください。パッケージをダウンロードすると、新しい関数の本をライブラリに保存しますが、その本に含まれる関数を使用する際に、ライブラリから本を借りる(「読み込む」)必要があります。

要約:R パッケージ内に含まれている利用可能な関数を使用するには、以下の 2 つの手順を実行する必要があります。

  1. パッケージは(1 回だけ)インストールされる必要があり、かつ
  2. パッケージは(各 R セッションにおいて)読み込まれる必要があります

個人のライブラリ

「ライブラリ」は、実際にはコンピュータ上のフォルダであり、インストールされている各パッケージのフォルダがそれぞれ含まれています。 R がコンピュータのどこにインストールされているかを調べ、“win-library” というフォルダを探してみてください。例:R\win-library\4.0 (4.0 は R のバージョンです。ダウンロードした R バージョンごとに異なるライブラリがあります)。

.libPaths() を(空の括弧つきで)コンソールに入力し実行すると、ライブラリのファイルパスが出力されます。これは、ネットワークドライブで R を使用する場合 を使用するときに特に重要です。

CRAN からのインストール

ほとんどの場合、R ユーザーは CRAN からパッケージをダウンロードします。CRAN(Comprehensive R Archive Network)は、R コミュニティのメンバーが R パッケージをオンラインで公開する場所です。

CRAN からパッケージをダウンロードするときに、ウイルスとセキュリティについて懸念がある場合は、このトピックに関するこちらの こちらの記事 を参照してください。

インストールと読み込みの方法

このハンドブックでは、packman パッケージ(“package manager” の省略)の使用を推奨しています。このパッケージには、必要に応じてパッケージをインストールし、かつ現在の R セッションで使用するためにパッケージを読み込む便利な関数である p_load() が含まれています。

p_load() の構文は非常にシンプルです。p_load() の括弧内に、コンマで区切られたパッケージ名を記載するだけです。例えば、以下のコマンドは、riotidyversehere パッケージについて、まだインストールされていなければ、インストールを行い、使用するのために読み込みます。p_load() の利用は、他の人とスクリプトを共有する場合に特に便利で簡潔です。パッケージ名は大文字と小文字が区別されることに注意してください。

# (必要であれば)インストールし、使用のために読み込む
pacman::p_load(rio, tidyverse, here)

ここでは、関数名(p_load())の前に、パッケージ名(pacman)を明示的に記述し、これらを 2 つのコロンでつなぐ構文 pacman::p_load() を使用していることに注意してください。この書き方は、(すでにインストールされている場合に)pacman パッケージの読み込みにも便利です。

base R 内には、よく使用されているのを見かける、p_load() と同じような働きをする関数があります。パッケージをインストールするための base R の関数は、install.packages() 関数です。インストールするパッケージの名前は、括弧内で二重引用符で囲まれている必要があります。1 つのコマンドで複数のパッケージをインストールしたい場合は、c() でリスト化した文字ベクトルにして指定する必要があります。

注釈:install.packages() は、パッケージを インストールしますが、現在のセッションで使用するための読み込みは行いません

# base R の関数で 1 つのパッケージをインストールする
install.packages("tidyverse")

# base R の関数で複数のパッケージをインストールする
install.packages(c("tidyverse", "rio", "here"))

インストールは、コードを書く代わりにマニュアルでクリックして行うことも可能です。RStudio の “Packages” ペインに移動して、“Install” をクリックし、目的のパッケージ名を検索することで実行できます。

インストールしたパッケージを使用するために読み込む base R パッケージの関数は、library() です。この関数は、一度に 1 つのパッケージしか読み込みできません(これが p_loard() を使用するもう 1 つの理由です)。パッケージ名は、二重引用符つきでも、なしでも指定できます。

# base R パッケージの関数で複数のパッケージを読み込む
library(tidyverse)
library(rio)
library(here)

パッケージがインストールまたは読み込まれているかどうかを知りたい場合は、RStudio の Packages ペインで確認できます。パッケージがインストールされている場合は、バージョン番号とともに Packages ペインに表示されます。このボックスにチェックマークがついていた場合、現在のセッションで読み込まれています。

Github からのインストール

場合によっては、CRAN からまだ入手できないパッケージをインストールしなければならないことがあります。あるいは、パッケージは CRAN で入手可能であるが、より安定し、また、(公開されている CRAN バージョンではまだ提供されていない)新機能を備えた開発バージョンのダウンロードが必要な場合もあります。このようなパッケージは、多くの場合、github.com のウェブサイトに無料で公開され、コード「リポジトリ」として公開されています。Github については、ハンドブックの Git と Github を使用したバージョン管理と共同作業 の章で詳しく説明しています。

Github から R パッケージをダウンロードする場合は、pacman パッケージの p_load_gh() を使用できます。p_load_gh() は、必要に応じてパッケージをGithub からインストールし、現在の R セッションで使用できるように読み込みます。他にも、remotes パッケージや devtools パッケージを使用しても Github からパッケージをインストールすできます。pacman パッケージに含まれるすべての関数をご覧になりたい方は こちらの公式ドキュメント を参照してください。

Github からパッケージをインストールする際は、より多くの情報が必要です。必要な情報は、以下の通りです。

  1. リポジトリ所有者の Github ID
  2. パッケージを含むリポジトリの名前
  3. (任意:特定の開発バージョンをダウンロードしたい場合)ダウンロードしたいブランチ(branch)の名前

以下の例では、二重引用符で囲まれた部分のうち、スラッシュの前がリポジトリ所有者の Github ID であり、後がリポジトリの名前(パッケージ名)です。

# Github リポジトリから epicontacts パッケージをインストールして読み込む
p_load_gh("reconhub/epicontacts")

メインブランチ(main branch)以外の ブランチからパッケージをインストールする場合は、リポジトリ名の後に続けて、“@” とブランチ名を追加します。

# Github から "timeline" ブランチにある epicontacts パッケージをインストールする
p_load_gh("reconhub/epicontacts@timeline")

手元のコンピュータにあるバージョンと Github にあるバージョンが同じ場合は何も起こりません。p_load_current_gh() を使用する際に、update =TRUE と指定すると、パッケージを「強制的に」再インストールすることができます。packman パッケージについての詳細は、こちらのドキュメント を参照してください。

ZIP や TAR からのインストール

URL からパッケージをインストールすることもできます。

packageurl <- "https://cran.r-project.org/src/contrib/Archive/dsr/dsr_0.2.2.tar.gz"
install.packages(packageurl, repos=NULL, type="source")

または、zip ファイルをコンピュータに保存することでパッケージをダウンロードすることもできます。

選択肢 1:remotes パッケージの install_local() を使う

remotes::install_local("~/Downloads/dplyr-master.zip")

選択肢 2:base R パッケージの install.packages() を使用し、ZIP ファイルへのファイルパスを指定して type = "source"repos = NULL を指定する

install.packages("~/Downloads/dplyr-master.zip", repos=NULL, type="source")

コードの書き方

このハンドブックでは、わかりやすくするために、次のように関数名の前に :: 記号を使用してパッケージの名前を記載することがあります:package_name::function_name()

起動中の R セッションに使用したい関数のパッケージがすでに読み込まれている場合は、このような明示的な関数の呼び出しは必要なく、単に function_name() を書くだけで問題ありませんが、呼び出したい関数名が一般的な名前で、複数のパッケージに存在する可能性がある場合(例:plot())には、パッケージ名を併記すると便利です。パッケージ名を併記すると、そのパッケージがまだ読み込まれていない場合には、そのパッケージを読み込みます。

# rio パッケージの import() 関数を使用してデータセットをインポートする
linelist <- rio::import("linelist.xlsx", which = "Sheet1")

関数のヘルプ

関数について詳しく知りたい場合は、RStudio の右下にある Help タブで検索することができます。また、?thefunctionname(クエスチョンマークの後に関数名を入力する)のようにコマンドを実行すると、ヘルプページが Help ペインに表示されます。オンラインで関数に関する情報を検索することもできます。

パッケージのアップデート

パッケージは、再インストールすることでアップデートできます。また、RStudio の Packages ペインにある緑色の “Update” ボタンをクリックすると、新しいバージョンがインストール可能なパッケージを確認することもできます。パッケージのアップデートによって関数の動作が大きく変更された場合、古いコードを書き換える必要があることに注意してください。

パッケージの削除

パッケージの削除には、packmanp_delete() を使用するか、base R の remove.packages() を使用します。または、ライブラリを含むフォルダを見つけて手動でフォルダを削除します。

依存関係

多くの場合、パッケージは他のパッケージに依存して機能します。これを依存関係と呼びます。依存関係にあるパッケージのインストールに失敗した場合、そのパッケージに依存しているパッケージのインストールにも失敗することがあります。

p_depends() でパッケージの依存関係を確認し、p_depends_reverse() でどのパッケージがそれに依存しているかを確認できます。

マスクされた関数

2 つ以上のパッケージに同じ関数名が含まれていることは珍しくありません。例えば、dplyr パッケージには filter() がありますが、stats パッケージにも同じ名前の関数があります。同じ名前の関数を R セッションで読み込む場合、読み込まれる順番によって、デフォルトで呼び出される filter() がどちらのパッケージの関数であるかが決まります。デフォルトで呼び出される filter() コマンドは、後に読み込まれたパッケージの関数になります。

RStudio の Environment ペインでは、順番を確認できます。“Global Environment” のドロップダウンメニューをクリックして、パッケージの読み込み順序を確認してください。このドロップダウンリストの下位にあるパッケージの関数は、ドロップダウンリストの上位に表示されるパッケージ内に含まれている同じ名前の関数をマスクします。パッケージを読み込む際、R はマスキングが発生しているかどうかをコンソール上で警告しますが、警告に気づかない場合が多く、よく見逃されます。

マスキングを外す方法は以下の通りです。

  1. コマンド実行時にパッケージ名を指定します。例えば、dplyr::filter()
  2. パッケージが読み込まれる順序を変更して(例:p_load() 内)、新しい R セッションを開始します

デタッチやアンロード

パッケージをデタッチする(アンロードする; 読み込んだパッケージを破棄する)には、以下のコマンドのように、正しいパッケージ名とコロンを 1 つだけ指定して detach() を使用します。なお、このコマンドを実行しても、マスキングが解決されない場合があります。

detach(package:パッケージ名, unload=TRUE)

過去のバージョンをインストールする

特定のパッケージの過去のバージョンをインストールしたい場合は、こちらのドキュメント を参照してください。

推奨パッケージ

日常の疫学業務に便利な推奨パッケージの一覧は、推奨するパッケージ の章をご覧ください。

3.8 スクリプト

スクリプトはプログラミングの基本的なパーツです。スクリプトは、コマンド(例えば、データセットの作成や更新、データ可視化の出力などを行う関数)を含むドキュメントです。スクリプトを保存し、後で実行することができます。スクリプトにコマンドを保存して実行するには、(R コンソールにコマンドを 1 つずつ入力することに比べて)多くの利点があります。

  • 可搬性:共同作業者にスクリプトを送ることで、共同で作業を行うことができます
  • 再現性:自分や共同作業者が「何を実行したか」を正確に知ることができます
  • バージョン管理:自分や共同作業者が行った作業の変更履歴を追跡することができます
  • コメントや注釈の付加:共同作業者に自分が何を行ったのかを説明することができます

コメント付加

スクリプト内で、R のコードに注釈(「コメント」)を付加することもできます。コメントは、自分自身や他の読み手に、コードが何を行っているかを説明するのに役立ちます。コメントを付加するには、ハッシュ記号(#)を入力し、その後にコメント内容を記述します。コメントは、R コードとは別の文字色で表示されます。

ハッシュ記号(#)の後に書かれたコードは実行されません。したがって、コードの前に # を置くと、コードを削除したくないが一時的にその行の実行をブロックする(「コードをコメント化する」)場合に便利な方法でもあります。複数行を選択して Ctrl + Shift + c(Mac では Cmd + Shift + c)を押すと、一度に複数行をコメント化したり、またはコードをコメントでない状態に戻すことができます。

# コメントは 1 行にまとめることができる
# データのインポート
linelist <- import("linelist_raw.xlsx") %>%   # コード行の終わりにコメントを付加
# filter(age > 50)                          # コードのコメント化にも使用できる
  count()
  • コメントには、そのコードが何をしているかを残し、また、なぜそのコードを実行するかについても残しましょう
  • 合理的なサイズにコードを分割しましょう
  • コードとともに、何をしているかをステップごとにテキストで説明しましょう(例えば、ステップを番号付きで明示しましょう)

コーディングスタイル

特にチームで作業する場合は、コーディングスタイルを意識することが必要です。私達は、tidyverseスタイルガイド を提唱しています。このスタイルに準拠するのに役立つ、stylerlintr などのパッケージもあります。

コードを他の人が読めるようにするために、いくつか非常に基本的なポイントを挙げます。

* オブジェクトに名前をつける際に使用する文字や記号は、英語の小文字、数字、アンダースコア _ のみにする。(例:my_data

* 演算子の前後など、頻繁にスペースを挿入する。(例:n = 1age_new <- age_old + 3

スクリプトの例

以下は、短い R スクリプトの例です。コメントでコードを簡潔に説明すればするほど、共同作業者に喜ばれることを覚えておいてください。

R arkdown

R markdown スクリプトは、スクリプト自体が出力用のドキュメント(PDF、Word ファイル、HTML、Powerpoint ファイルなど)になる R スクリプトの一種です。このウェブサイトやハンドブックも R markdownスクリプトで作られています。

R 初心者の方でも、R markdown を使うことができます!詳しく学びたい方は、本ハンドブックの R Markdown で作るレポート の章を参照してください。

R notebooks

R markdown と R notebook に違いはありませんが、ドキュメントの実行方法が若干異なります。詳しくは こちらのウェブサイト をご覧ください。

Shiny

Shiny アプリやウェブサイトは、app.R という 1 つの R スクリプトで構成されています。このファイルは以下の 3 つで構成されています。

  1. ユーザインタフェース(ui)
  2. サーバ関数
  3. shinyApp 関数の呼び出し

詳細は、このハンドブックの Shiny で作るダッシュボード の章を参照していただくか、こちらの Shiny チュートリアル をご覧ください。

app.R は、昔は 2 つのファイル(ui.Rserver.R)に分かれていました。

コードの折りたたみ

コードの一部を折りたたみ、スクリプトを読みやすくすることができます。

コードを折りたたむには、# でテキストヘッダを書き始め、ヘッダを記述し、半角スペースをあけて、ダッシュ(-)、ハッシュ(#)、イコール(=)のいずれかの記号を少なくとも 4 つ続けて記述します。このように記述することで、スクリプトの左側にある行番号の隣の「すき間」に小さな下三角形が現れます。この下三角形をクリックすると、それ以降のコードが次のヘッダまで折りたたまれ、折りたたまれたことを示す左右矢印のアイコンが表示されます。

折りたたまれたコードを展開するには、すき間の三角形をもう一度クリックするか、左右矢印アイコンをクリックします。また、この章の RStudio セクションで説明されているように、キーボードのショートカットもあります。

記号 # を使用してヘッダを作成すると、スクリプトの左下部にある目次(以下の図を参照)もアクティブになり、スクリプト内で移動がしやすくなります。サブヘッダを作成するには、# シンボルを連続させます。見出し 1 の場合は #、見出し 2 の場合は、##、見出し 3 の場合は、### となります。

以下は、サンプルスクリプトの 2 つのバージョンです。左側は、コメント付きのヘッダがついたオリジナルです。右側では、各ヘッダの後に 4 つのダッシュ(-)が記述されており、折りたたみ可能になっています。そのうちの 2 つが折り畳まれており、スクリプト左下部の目次に各セクションが表示されていることがわかります。

その他、自動的に折りたたみの対象となるコード領域は、関数定義や、条件ブロック(if else 文)など、波括弧 { } で囲まれたコードです。コードの折りたたみについての詳細は、RStudio のウェブサイトサイト を参照してください。

3.9 作業ディレクトリ

作業ディレクトリとは、R が入出力に使用するルートフォルダの場所です。つまり、R がデフォルトでファイルを参照したり保存したりする場所です。 デフォルトでは、新しいファイルや出力はこの場所に保存され、インポートするファイル(データセットなど)もこの場所から検索されます。

作業ディレクトリは、RStudio の Console ペインの上部に灰色のテキストで表示されます。getwd() を実行して現在の作業ディレクトリをコンソールに出力して表示することもできます(括弧内は空のままにします)。

推奨される方法

作業ディレクトリについて推奨する方法の詳細は、R プロジェクトの設定 の章を参照してください。 作業ディレクトリとファイルパスを管理するために、一般的で効率的かつ、トラブルのない方法は、以下の 3 つの要素を R プロジェクトの設定 の章で紹介する R プロジェクト指向のワークフローで組み合わせることです。

  1. 1 つの R プロジェクトにすべてのファイルを集約します(R プロジェクトの設定 の章を参照してください)
  2. here パッケージでファイルの場所を指定します(データのインポート・エクスポート の章を参照してください)
  3. rio パッケージでファイルのインポートとエクスポートを行います(データのインポート・エクスポート の章を参照してください)

コマンドによる設定

最近まで、R の学習者の多くは、スクリプトを setwd() コマンドで始めるよう教えられていましたが、代わりに R プロジェクトの設定 の章で紹介する R プロジェクト指向のワークフローの使用をおすすめします。あわせて、setwd() を使用しない理由が説明された こちらのドキュメント を参照してください。簡単に述べると、setwd() を使用した場合、行っている作業がお手元のコンピュータにのみ通用するものとなります。したがって、ファイルのインポートやエクスポートに使われるファイルパスは、他のコンピュータにとって「頼りにならない」ものになり、共同作業や、他のコンピュータでの作業を阻害します。他にもっとよいやり方があるのです!

今述べたように、ほとんどの場合は setwd() を使用する方法はおすすめできませんが、使うことはできます。以下のように、目的のフォルダのファイルパスを二重引用符で囲んで、setwd() コマンドに渡すことができます。

setwd("C:/Documents/R Files/My analysis")

注意setwd() で作業ディレクトリを設定することは、そのファイルパスがある 1 台のコンピュータに特有の場合、「頼りにならない」ものになりえます。代わりに、(here パッケージを使用して)R プロジェクトのルートディレクトリからの相対的なファイルパスを使用してください。

手動での設定

作業ディレクトリを手動で設定するには、(setwd() に相当する、マウスのクリックによる操作)メニューバーから Session をクリックし、ドロップダウンメニューから、“Set Working Directory” をポイントし、“Choose Directory” をクリックします。この操作で、特定の R セッション用の作業ディレクトリが設定されます。 注意:この方法を使用する場合、RStudio を開くたびに手動で設定する必要があります。

R プロジェクト内で

R プロジェクト内で実行している場合、作業ディレクトリのデフォルトは、“.rproj” ファイルを含む R プロジェクトのルートフォルダになります。これは、R プロジェクトファイル(拡張子が “.rproj” )をクリックして、RStudio を開いた場合に適用されます。

R markdown における作業ディレクトリ

R markdown スクリプトでは、 R markdown ファイル(.Rmd)が保存されているフォルダが、デフォルトの作業ディレクトリとなります。R プロジェクトと here パッケージを使用している場合には、デフォルトは適用されず、R プロジェクトの設定 の章で説明されているように、作業ディレクトリは here() となります。

単独ファイルの R markdown の作業ディレクトリを変更したい場合(R プロジェクトを使用せずに R markdown を使用している場合)、setwd() を使用すると、その特定のコードチャンクのみ適用されます。R markdown 内のすべてのコードチャンクに変更を加えるには、以下のように root.dir = パラメータを追加するするために設定用のチャンクを追加します。

knitr::opts_knit$set(root.dir = 'desired/directorypath')

この方法より、R プロジェクト内で R markdown を使用し、here パッケージを使用する方が遥かに簡単です。

ファイルパスの設定

おそらく多くの R 初心者が不満に感じることは(少なくとも Windows では)、データのインポート、エクスポートのためのファイルパスを打ち込むことです。ファイルパスを最適に入力する方法については、データのインポート・エクスポート の章で詳細を説明しますが、以下に重要なポイントをいくつか記載します。

機能しないファイルパス

以下に、「絶対パス」(もしくは、「フルアドレスパス」)のファイルパスのサンプルを記載しています。「絶対パス」で書かれたファイルパスは、他のコンピュータ上では機能しなくなります。例外の 1 つは、共有ドライブもしくは、ネットワークドライブを使用している場合です。

C:/Users/Name/Document/Analytic Software/R/Projects/Analysis2019/data/March2019.csv  

ディレクトリの区切り記号

ファイルパスを入力する場合は、スラッシュの向きに注意してください。フォルダとファイル名の区切り(例:“data/provincial.csv”)には、スラッシュ(/を使用してください。Windows でのデフォルトのファイルパスは、バックスラッシュ(\\で表示されます。そのため、Windows ユーザーは各バックスラッシュ(\\)をスラッシュ(/)に変える必要があります。R プロジェクトの設定 の章で詳細を説明する here パッケージを使用する場合は、スラッシュ記号は問題になりません。

相対パス

通常、絶対パスの代わりに、「相対パス」でファイルパスを記述することをおすすめします。つまり、R プロジェクトのルートからの相対的なパスです。R プロジェクトの設定 の章で説明されているように、here パッケージを使うと相対パスを書くことができます。「相対パス」のファイルパスは以下のようになります。

# R プロジェクトの data/linelist/clean サブフォルダから csv 形式のラインリストをインポートする
linelist <- import(here("data", "clean", "linelists", "marin_country.csv"))

R プロジェクト内で相対パスを使用していても、R プロジェクト外でデータをインポートやエクスポートする際には、絶対パスを使用することができます。

3.10 オブジェクト

R は「オブジェクト指向 」言語であり、R で使用されるすべてのものはオブジェクトです。このセクションでは、以下の項目について説明します。

  • オブジェクトの作り方(<-
  • オブジェクトの型(例:データフレーム、ベクトルなど)
  • オブジェクトの構成要素にアクセスする方法(例:データセット内の変数)
  • オブジェクトのデータ型(例:数字型、ロジカル型、整数型、実数型、文字型、因子型)

オブジェクト指向

このセクションは、R4Epis プロジェクトのウェブサイト を元に作成されました。データセット、変数、村の名前のリスト、総人口の数、さらにはグラフのような出力結果など、R に格納されるものはすべてオブジェクトであり、名前が割り当てられ、後のコマンドから参照可能です。

オブジェクトは、値を割り当てられた時点で存在します(後述の割り当てのセクションを参照してください)。値が割り当てられると、オブジェクトは Environment ペインに表示されます(RStudio の右上にあります)。割り当てにより、オブジェクトの操作、変更、再定義が可能になります。

オブジェクトを(<-)で定義する

R では、<- 演算子によって値を割り当てることでオブジェクトを生成します。 割り当て用の演算子 <- は「〜と定義する」と解釈できます。割り当てコマンドは、通常以下のように書きます。

オブジェクト名 <- (もしくは、値を生成するプロセスや計算)

例えば、現在の疫学週を表す値を、後のコードで参照するためにオブジェクトとして格納したいとします。以下の例では、current_week というオブジェクトに "2018-w10" という値が割り当てられ、定義されています(値は二重引用符で囲まれているため、文字型として定義されます)。current_week オブジェクトは、 RStudio の右上にある Environment ペインに表示され、以降のコマンドで参照できます。

以下の R コマンドと出力結果を確認してください。

current_week <- "2018-W10"   # 値を割り当てることで current_week オブジェクトを生成する
current_week                 # コンソールへ current_week オブジェクトの現在の値を出力する
## [1] "2018-W10"

注釈R コンソールでの [1] という出力は、これが出力の最初の項目であることを単に示しているだけということに注意してください。

注意オブジェクトの値を再定義するコマンドを実行することによって、オブジェクトに格納されている値は、上書きされます。 そのため、コマンドを実行する順序が非常に重要になります。

以下のコマンドは、current_week の値を再定義します。

current_week <- "2018-W51"   # current_week オブジェクトに新しい値を割り当てる
current_week                 # current_week の現在の値をコンソールへ出力する
## [1] "2018-W51"

等号記号 =

R コード中に等号記号を見かけることもあります。等号記号は以下の場面で使用されています。

  • 2 つのオブジェクトや値の間に置かれた二重等号 == は、論理的な問いかけを示しています。(例:左辺と右辺は等しいか?)
  • 関数の引数の値を定義するために、関数内で等号が使われている場合もあります(後述のセクションを参照してください)。(例:max(age, na.rm = TRUE)
  • オブジェクトを生成する際に、<- の代わりに単独の等号 = を使うこともできますが、この方法は推奨されていません。こちらのドキュメント に、なぜ推奨されていないかの理由が記載されています。

データセット

データセット(通常は「データフレーム」)もオブジェクトであり、インポートされた際に名前を割り当てる必要があります。以下のコードでは、rio パッケージの import() でインポートされた CSV ファイルの値が linelist と名付けたオブジェクトに割り当てられ、定義されています。

# インポートされた CSV ファイルの値が割り当てられ linelist が生成される
linelist <- import("my_linelist.csv")

データのインポート・エクスポート の章では、データセットのインポートとエクスポートについて更に詳しく説明しています。

注意 以下は、オブジェクトの名付けに関する注釈です

  • オブジェクトの名前は、スペースを含んではいけません。スペースの代わりに、アンダースコア( _ )やピリオド( . )を使用してください。
  • オブジェクトの名前は、大文字と小文字が区別されます(つまり、Dataset_A と dataset_A は別のオブジェクトです)。
  • オブジェクトの名前は、英字で始めなければいけません(1, 2, 3 のような数値で始めることはできません)。

出力

表やプロットのような出力は、出力がオブジェクトとして格納される、または、格納されずに単純に(コンソールに)出力される良い例です。例えば、base R の table() を利用して作成した性別とアウトカムのクロス集計表は、(格納することなく)R コンソールに直接出力することもできます。

# R コンソールのみに出力
table(linelist$gender, linelist$outcome)
##    
##     Death Recover
##   f  1227     953
##   m  1228     950

また、同じ集計表を名前付きオブジェクトとして保存することもできます。保存後に、コンソールに出力することもできます。

# 保存する
gen_out_table <- table(linelist$gender, linelist$outcome)

# 出力する
gen_out_table
##    
##     Death Recover
##   f  1227     953
##   m  1228     950

データセット内の列も、オブジェクトであり、定義、上書き、生成などが可能です。

新しい列を作成するために、base R の割り当て演算子(<-)を使用することができます。以下の例では、bmi (Body Mass index)という名前の列を生成しています。そして、生成された bmi 列の各行には、wt_kg 列と ht_cm 列の値を使って計算された結果が値として割り当てられます。

# base R パッケージの構文を利用して、新たに "bmi" 列を生成する
linelist$bmi <- linelist$wt_kg / (linelist$ht_cm/100)^2

列を生成し定義する方法は他にもあり、このハンドブックでは、上記とは別の方法に重点を置きます。それは、dplyr パッケージの mutate() とパイプ演算子(%>%)を使用したパイプ処理で新しい列を生成することです。この方法で書かれたコードの方が読みやすく、また、データクリーニングと主要関数 の章で説明されているような利点があります。パイプ処理の詳細ついては、以降のパイプ処理セクションで詳しく説明しています。

# dplyr 構文を用いて、新たに "bmi" 列を生成する
linelist <- linelist %>% 
  mutate(bmi = wt_kg / (ht_cm/100)^2)

オブジェクトの構造

オブジェクトはひとかけらのデータ(例:my_number <- 24)もしくは、構造化されたデータからなります。

以下の画像は こちらのオンライン R チュートリアル から引用しました。いくつかの一般的なデータ構造とその名前を示しています。空間データは、この図には含まれておらず、GIS の基礎 の章で詳しく説明します。

疫学領域(特に実地疫学; 訳注: 感染症の疫学調査などを行う領域)においては、とても高頻度でデータフレームやベクトルに出会うでしょう。

データ構造 説明
Vector ベクトル:一連の単独オブジェクトを格納するもの。格納されている要素のデータ型はすべて同じ。(例:数字型や文字型) データフレームにおいて「変数」(または列)はベクトルである。(例:age_years 列)
Data Frame データフレーム:すべて同じ数の行を持つベクトル(例:列)を束ねたもの。 linelist はデータフレームである。

なお、(データフレームに属さない)「独立した」ベクトルを作成する場合は、c() を使用して異なる複数の要素を結合する必要があります。例えば、図を作成する際に色付け用のベクトルを作成する場合は、以下のように書きます。

vector_of_colors <- c("blue", "red2", "orange", "grey")

オブジェクトのデータ型

R に保存されているすべてのオブジェクトには、データ型があります。データ型は、R に対してオブジェクトの扱いを示します。取り得るデータ型は無数にありますが、通常は以下に示す範囲です。

データ型 説明
Character 文字型:「二重引用符に囲まれた」テキスト(単語や文章)をとる。文字型のオブジェクトに対しては、計算できない。 “Character objects are in quotation marks”
Integer 整数型:整数のみ (小数は含まない)をとる。 -5、14 や 2000
Numeric 数字型:小数を含む数値。二重引用符に囲まれていた場合は、 文字型として扱われる。 23.1 や 14
Factor 因子型:特定の順序 あるいは、階層構造を持つベクトル 順序付けられた値を持つ経済状態の変数
Date 日付型:あるデータが、日付であると R に示すと、そのデータは特別な方法で操作や表示ができる。日付型データ の章を参照。 2018-04-12、15/3/1954 や Wed 4 Jan 1980
Logical ロジカル型:2 つの特別な値 TRUE もしくは FALSE をとる。(二重引用符付きの “TRUE” や “FALSE” ではないことに注意) | TRUE あるいは FALSE
data.frame データフレーム型:R が典型的なデータセットを保存する方法。このデータ型は、同じ数の観測値(行)を持つデータのベクトル(列)をまとめたもの。 例えば、linelist_raw と名付けられた AJS データセットには、68 個の変数と 300 個の観測値(行)が含まれる
tibble tibble 型:この型は、データフレームの変化形の 1 つで、動作上の違いは、コンソールに整った形で出力されること。(最初の 10 行と、画面に収まる列のみを表示) いかなるデータフレーム、リスト、マトリックスは、as_tibble() で tibble 型に変換できる
list リスト型:ベクトルと似ているが、別のデータ型のオブジェクトを要素に含むことができる リスト型には、1 つの数値、データフレーム、ベクトル、リスト型そのものも格納できる

class() にオブジェクトの名前を渡すことで、オブジェクトのデータ型を確認できます。 注釈:データセット内の特定の列を参照するには、データセット名と列名を $ 記号で区切って記述します。

class(linelist)         # データフレーム型もしくは tibble 型であるべき
## [1] "data.frame"
class(linelist$age)     # 数字型であるべき
## [1] "numeric"
class(linelist$gender)  # 文字型であるべき
## [1] "character"

ときには、R によって列が自動的に別のデータ型に変換されることがありますが、これには注意が必要です!例えば、数値を含む列やベクトルに、文字列が挿入されると…列全体が文字型に変わります。

num_vector <- c(1,2,3,4,5) # すべてが数値のベクトルを定義
class(num_vector)          # ベクトルのデータ型は 数字型
## [1] "numeric"
num_vector[3] <- "three"   # 3 番目の要素を、文字型の文字列に変更
class(num_vector)          # ベクトルのデータ型は、文字型に変わってしまう
## [1] "character"

よくある例としては、データフレームを操作して表を印刷するときに、合計の行を作り、同じセルにパーセンテージを数字として貼り付けようとすると(例:23 (40%))、数字の列全体が 文字型に変換され、数学的な計算に使用できなくなります。場合によっては、オブジェクトや列を別のデータ型に変換する必要があります。

よくある例としては、データフレームを操作して表を印刷するときに、合計の行を作り、同じセルにパーセンテージを数字として貼り付けようとすると(例、23 (40%))、数字の列全体が 文字型に変換され、数学的な計算ができなくなります。場合によっては、オブジェクトや列を別のデータ型に変換する必要があります。

関数 動作
as.character() 文字型に変換する
as.numeric() 数字型に変換する
as.integer() 整数型に変換する
as.Date() 日付型に変換する。注釈:詳細は 日付型データ の章を参照。
factor() 因子型に変換する。注釈:値の順序の再定義には、追加の引数が必要になる。

同様に、base R にもオブジェクトのデータ型を調べる一連の関数があります。例:is.numeric(), is.character(), is.double(), is.factor(), is.integer()

データ型やデータ構造に関して更に学びたい方は、こちらのドキュメント をご覧ください。

列および変数($

データフレーム内の列は、厳密には、「ベクトル」です(上記の表を参照)。ベクトルとは、すべてが同じデータ型(文字型、数字型、ロジカル型など)でなければならない一連の値です。

ベクトルは、データフレームとは独立して存在できます。例えば、モデルに説明変数として含めたい列名のベクトルなどがあります。「独立した」ベクトルを作成するには、以下のように c() を使います。

# 文字型の値を持つ独立したベクトルを定義する
explanatory_vars <- c("gender", "fever", "chills", "cough", "aches", "vomit")

# 名前付きベクトルの値を出力する
explanatory_vars
## [1] "gender" "fever"  "chills" "cough"  "aches"  "vomit"

データフレーム内の列もベクトルであり、$ 記号を使用して、呼び出し、参照、抽出、生成などができます。 $ 記号は、データフレームの名前と列の名前をつなげるものです。このハンドブックでは、「変数」と言う代わりに「列」という言葉を使うようにしています。

# age_years ベクトルの長さを取得する
length(linelist$age) # (age は linelist データフレーム中の列)

データフレームの名前の後に、$ 記号を入力すると、データフレーム内のすべての列がドロップダウンメニューで表示されます。矢印キーで列をスクロールし、Enter キーで列を選択することができます。この方法で入力すると、スペルミスが防げます!

応用的なヒントより複雑なオブジェクト(リストや、epicontacts オブジェクトなど)は、多数の階層を保持している場合があり、複数の $ 記号を使用することでアクセスできます。例:epicontacts$lineline$date_onset

角括弧([ ])で要素を抽出する

オブジェクトの一部を表示する必要がある際、角括弧 [ ] (またはブラケット記号)がよく使用されます。これは、「インデックス(indexing)」とも呼ばれます。データフレーム上で、$ 記号を使用して列にアクセスするのもインデックスの一種です。

my_vector <- c("a", "b", "c", "d", "e", "f")  # ベクトルを定義する
my_vector[5]                                  # 5 番目の要素を出力する
## [1] "e"

角括弧は、summary() の出力のように、返された出力結果の特定の部分のみを表示したい場合にも使用できます。

# summary をすべて出力
summary(linelist$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.00    6.00   13.00   16.07   23.00   84.00      86
# summary の 2 番目の要素のみを、名前とともに出力(角括弧のペアを 1 つだけ使用)
summary(linelist$age)[2]
## 1st Qu. 
##       6
# 2 番目の要素のみを抽出し、要素の名前を含めずに出力(角括弧のペアを二重に使用)
summary(linelist$age)[[2]]
## [1] 6
# 名前をもとに要素を抽出し、要素の名前を含めずに出力
summary(linelist$age)[["Median"]]
## [1] 13

角括弧はデータフレームでも使用でき、特定の行や列を表示します。以下のように、dataframe[rows, colums] という構文を使用します。

# データセットから特定の行(2行目)のすべての列情報を表示(コンマを忘れずに!)
linelist[2,]

# すべての行のある特定の一列の表示
linelist[, "date_onset"]

# 2 行目の 5 列目から 10 列目の値を表示
linelist[2, 5:10] 

# 2 行目の 5 列目から 10 列目および 18 列目の値を表示
linelist[2, c(5:10, 18)] 

# 2 行目から 20 行目の特定の列を表示
linelist[2:20, c("date_onset", "outcome", "age")]

# 条件式に基づいて行と列を表示
# *** 条件式にはデータフレームの名前が含まれてなければなりません!
linelist[linelist$age > 25 , c("date_onset", "outcome", "age")]

# View() を使用し、RStudio の Viewer ペインで出力結果を表示する(読みやすい表示)
# *** View() は大文字 "V" であることに注意
View(linelist[2:20, "date_onset"])

# 新しいオブジェクトとして保存
new_table <- linelist[2:20, c("date_onset")] 

なお、上記の行や列のインデックスは、dplyr の構文(行に対しては filter()、列に対してはselect() )を使用しても可能です。このような中核となる関数については、データクリーニングと主要関数 の章を参照してください。

「行番号(row number)」に基づいて行の抽出(フィルタリング)を行うには、dplyrrow_number() を使用し、関数の括弧内は空ままで、filter() 関数内の論理的な条件式の一部に使用します。以下に示すように、多くの場合は、論理的な条件式の一部として、%in% 演算子を使用して数値の範囲を指定します。最初の N 行を表示したい場合は、dplyrhead() という特別な関数を用いることもできます。

# 最初の 100 行を表示
linelist %>% head(100)

# 5 行目のみを表示
linelist %>% filter(row_number() == 5)

# 2 行目から 20 行目までを、特定の列のみ表示(列名に二重引用符は不要ということに注意)
linelist %>% filter(row_number() %in% 2:20) %>% select(date_onset, outcome, age)

リスト型のオブジェクトをインデックスする場合、単一のオブジェクトしか返さない場合でも、1 つのペアの角括弧を使用してインデックスした場合は常にリスト型が返されます。しかし、2 つのペアの角括弧を使用したインデックスは、単一の要素にアクセスでき、リスト型とは異なるデータ型も返すことができます。

以下の例で示されるように、複数の角括弧のペアを続けて記述することも可能です。

リストのインデックスをコショウ入れに例えた こちらのウェブサイト は、図を用いて面白く解説しており、参考になります。

# 例示用のリストを定義
my_list <- list(
  # リストの最初の要素は、文字型のベクトル
  hospitals = c("Central", "Empire", "Santa Anna"),
  
  # リストの 2 番目の要素は、複数の住所を含むデータフレーム
  addresses   = data.frame(
    street = c("145 Medical Way", "1048 Brown Ave", "999 El Camino"),
    city   = c("Andover", "Hamilton", "El Paso")
    )
  )

上のコードで定義したリストをコンソールに表示すると、以下のようになります。以下の通りの 2 つの名前付きの要素があることがわかります。

  • hospitals - 文字型のベクトル
  • addresses - 住所のデータフレーム
my_list
## $hospitals
## [1] "Central"    "Empire"     "Santa Anna"
## 
## $addresses
##            street     city
## 1 145 Medical Way  Andover
## 2  1048 Brown Ave Hamilton
## 3   999 El Camino  El Paso

いくつかの方法を用いて、抽出してみましょう。

my_list[1] # "list" 型にある要素を返す(要素名はまだ表示される)
## $hospitals
## [1] "Central"    "Empire"     "Santa Anna"
my_list[[1]] # (要素名のない)文字型のベクトルが返される
## [1] "Central"    "Empire"     "Santa Anna"
my_list[["hospitals"]] # リスト要素の名前でインデックスを行う
## [1] "Central"    "Empire"     "Santa Anna"
my_list[[1]][3] # "hospitals" 文字型のベクトルの 3 番目の要素を返す
## [1] "Santa Anna"
my_list[[2]][1] # 住所データフレームの最初の列("street")を返す
##            street
## 1 145 Medical Way
## 2  1048 Brown Ave
## 3   999 El Camino

オブジェクトの削除

rm() の引数に個別のオブジェクトの名前を渡すことで(二重引用符無しで)、R 環境から削除できます。

rm(object_name)

すべてのオブジェクトを削除する(作業ディレクトリを空にする)場合は、以下のコマンドを実行してください。

rm(list = ls(all = TRUE))

3.11 パイプ演算子とオブジェクト(%>%

オブジェクトを使って作業を行う際に一般的な 2 つのアプローチは、以下の通りです。

  1. パイプ演算子および tidyverse:パイプ演算子を使用して関数から関数へオブジェクトを渡す方法です。つまり、オブジェクトそのものではなく、その動作に重点がおかれます。
  2. 中間オブジェクトを定義する:オブジェクトを何度も再定義する方法です。つまり、オブジェクトそのものに重点が置かれます。

パイプ処理

簡潔に説明すると、パイプ演算子(%>%)は、中間オブジェクトを 1 つの関数から次の関数へと渡します。

会話する時に、「そして」と話をつなげるような役割を持ちます。多く関数は、パイプ演算子(%>%)でつなげることができます。

  • パイプ処理は、動作が実行されているオブジェクトではなく動作のつながりに重点を置きます。
  • パイプ処理は、1 つのオブジェクトに対して、複数の動作を実行する必要がある場面で最適です。
  • パイプ処理を行う演算子(%>%)は、dplyrtidyverse パッケージに同梱されている magrittr パッケージに含まれています。
  • パイプ処理は、コードをより整えて読みやすく、かつより直感的に理解できるようにします。

パイプ処理に関する詳細は、tidyverseスタイルガイド を参照してください。

以下に、比較のための架空の例として、「ケーキを焼く」動作を紹介します。まずは、パイプ処理の例です。

# パイプ処理で、ケーキを焼く架空の例

cake <- flour %>%       # ケーキを定義する。まず小麦粉を用意して…
  add(eggs) %>%   # 卵を追加して
  add(oil) %>%    # 油を追加して
  add(water) %>%  # 水を追加して
  mix_together(         # 混ぜる
    utensil = spoon,
    minutes = 2) %>%    
  bake(degrees = 350,   # 焼成する
       system = "fahrenheit",
       minutes = 35) %>%  
  let_cool()            # 冷ます

パイプ処理の活用について、他の資料をご覧になりたい方は、こちら をご覧ください。

パイプ処理は、base R に含まれている関数ではありません。パイプ処理を使用するためには、magrittr パッケージがインストール、読み込まれている必要があります(基本的には、この操作は magritter パッケージを含む tidyversedplyr パッケージを読み込むときに行われます)。こちらの magrittr 公式ドキュメント でより詳しくパイプ処理について学ぶことができます。

他の R コマンドと同様に、パイプ処理は、代入演算子(<-)が含まれていない場合には出力結果を表示するためだけに使用でき、代入演算子(<-)が含まれている場合には、オブジェクトの定義や再定義もできることに注意してください。以下の 2 つの例を参考にしてください。

# オブジェクトを作成または上書きし、年齢カテゴリ別の集計カウントとして利用する(出力されない)
linelist_summary <- linelist %>% 
  count(age_cat)
# 集計カウント表をコンソールへ出力する。保存はされない。
linelist %>% 
  count(age_cat)
##   age_cat    n
## 1     0-4 1095
## 2     5-9 1095
## 3   10-14  941
## 4   15-19  743
## 5   20-29 1073
## 6   30-49  754
## 7   50-69   95
## 8     70+    6
## 9    <NA>   86

%<>%
これは、magrittr パッケージの「代入パイプ演算子」であり、前方のオプジェクト(左側のオブジェクト)をパイプ演算子で関数に渡し、関数の実行後にまたオブジェクトを再定義します。この演算子は、一連のパイプ処理の最初に置く必要があり、短縮表記として使用できます。以下の 2 つのコマンドは同じ動作を行います。

linelist <- linelist %>%
  filter(age > 50)

linelist %<>% filter(age > 50)

中間オブジェクトの定義

2 番目のアプローチは、オブジェクトやデータフレームを変更する以下の場合に適している可能性があります。

  • 複数のオブジェクトを操作する必要がある場合
  • 処理が意味を持ち、別のオブジェクト名にする必要がある中間処理がある場合

リスク:

  • 各処理ごとに新しいオブジェクトを作成することは、多数のオブジェクトを作成することになります。後に、間違ったオブジェクトを使ったとしても気づかない可能性があります!
  • すべてのオブジェクトに名前をつけると混乱する可能性があります
  • エラーが発生しても簡単には発見できなくなる可能性があります

それぞれの中間オブジェクトに名前をつけるか、元のオブジェクトを上書きするか、あるいは、すべての関数を組み合わせるか、いずれの選択肢もリスクを伴います。

以下は、前述の架空の「ケーキを焼く」動作の例です。今回は、中間オブジェクトを利用します。

# 中間オブジェクトを使用する方法で、ケーキを焼く架空の例
batter_1 <- left_join(flour, eggs)
batter_2 <- left_join(batter_1, oil)
batter_3 <- left_join(batter_2, water)

batter_4 <- mix_together(object = batter_3, utensil = spoon, minutes = 2)

cake <- bake(batter_4, degrees = 350, system = "fahrenheit", minutes = 35)

cake <- let_cool(cake)

次に、すべての動作を組み合わせる手法 ですが、この方法は非常に読みにくくなります。

# 組み合わさった、あるいは、ネスト状になった多数の関数 - 判読困難
cake <- let_cool(bake(mix_together(batter_3, utensil = spoon, minutes = 2), degrees = 350, system = "fahrenheit", minutes = 35))

3.12 重要な演算子と関数

このセクションでは、以下のような R の演算子について説明します。

  • 代入演算子
  • 関係演算子(~より少ない、~と等しい、など)
  • 論理演算子(and や or など)
  • 欠損値の扱い
  • 数学的演算子と関数(+/-、>、sum()、median() など)
  • %in% 演算子

代入演算子

<-

R の基本的な代入演算子は、<- です。オブジェクト名 <- 値 のように書きます。代入演算子は、= でも書き換え可能ですが、通常は <- 演算子の使用を推奨しています。 また、可読性向上のために、代入演算子の前後にスペースを挿入することを推奨しています。

<<-

関数の作成 する時、または、ソーススクリプトでのインタラクティブな R の使用時に、<<- 代入演算子が必要になる可能性があります(base R パッケージに含まれています)。この演算子は、より高次の 親クラスの R 環境(訳注: 複数の環境の関係において上にくる環境)でオブジェクトを定義するために使用されます。こちらの オンラインドキュメント を参照してください。

%<>%

これは、magrittr に含まれる、「代入パイプ演算子」です。この演算子は、前方のオブジェクトを演算子に渡し、そして、前方のオブジェクトを再定義します。パイプ処理の最初の演算子として使用しなければいけません。以下に示した 2 つの例のように、略式記法として機能します。

linelist <- linelist %>% 
  mutate(age_months = age_years * 12)

上のコマンドは、下のコマンドと同じ動作を行います。

linelist %<>% mutate(age_months = age_years * 12)

%<+%

この演算子は、ggtree パッケージを使用して、作成済みの系統樹へデータを追加する際に使用します。系統樹 の章もしくは、こちらの オンラインドキュメント を参照してください。

関係演算子と論理演算子

関係演算子は、値の比較に用いられ、データセットのサブセットを行う場合や、変数を定義する際によく使用されます。R でよく用いられる関係演算子は、以下の通りです。

意味 演算子 例のコマンドを実行した結果
〜と等しい == "A" == "a" FALSE (R は大文字小文字を区別するため)注意:==(二重等号)は、代入演算子 <- として働く =(等号)とは区別されます
〜と等しくない != 2 != 0 TRUE
〜より大きい > 4 > 2 TRUE
〜より小さい < 4 < 2 FALSE
〜以上 >= 6 >= 4 TRUE
〜以下 <= 6 <= 4 FALSE
値が欠損している is.na() is.na(7) FALSE欠損データの処理 の章を参照ください)
値が欠損していない !is.na() !is.na(7) TRUE

AND や OR などの論理演算子は、関係演算子とともによく用いられます。そして、より複雑な条件式を構築する際に使用されます。複雑な条件式では、複数の条件をグループに分けたり、処理順を明示するために括弧( )が必要な場合があります。

意味 演算子
AND &
OR |(バーティカルバー)
括弧 ( ) 複数の条件をグループにまとめたり、演算の処理順を明示したりするために使用されます

以下の例では、症例定義を作成するために、linelist 内の 2 つの変数を使用します。2 つの変数とは、テスト結果を保持する rdt_result 変数と、家庭内に他の症例があるかのフラグである other_cases_in_home 変数です。以下のコマンドでは、case_when() を使用して、症例定義のための新しい変数である case_def 変数を作成します。

linelist_cleaned <- linelist %>%
  mutate(case_def = case_when(
    is.na(rdt_result) & is.na(other_case_in_home)            ~ NA_character_,
    rdt_result == "Positive"                                 ~ "Confirmed",
    rdt_result != "Positive" & other_cases_in_home == "Yes"  ~ "Probable",
    TRUE                                                     ~ "Suspected"
  ))
上の例での条件 新しい “case_def” 変数に割り当てられた値
rdt_result 変数と other_cases_in_home 変数の値が欠損している NA(欠損)
rdt_result 変数の値が、“Positive” である “Confirmed”
rdt_result 変数の値が、“Positive” ではなく、かつ、other_cases_in_home 変数の値が “Yes” である “Probable”
上記の条件のいずれか 1 つに合致しない “Suspected”

R は大文字と小文字を区別するので、“Positive” と “positive” は異なる値として解釈することに注意してください!

欠損値

R では、欠損している値は特別な値 NA(「予約語」)で定義されています(二重引用符で囲まれた大文字の N と A ではありません)。もし別の方法で欠損値が表されたデータ(例:99、“Missing”、や ピリオドで表された欠損値)をインポートする場合、それらの値を NA に置き換えたくなるでしょう。置き換えの方法は、データのインポート・エクスポート の章を参照してください。

値が NA であるかどうかを確認するには、is.na() という特別な関数を使用します。この関数は、 TRUE もしくは、FALSE を返します。

rdt_result <- c("Positive", "Suspected", "Positive", NA)   # 2 例の陽性症例、1 例の疑い症例、1 例の不明症例
is.na(rdt_result)  # rdt_result 変数の値が NA であるかを確認する
## [1] FALSE FALSE FALSE  TRUE

欠損値や、無限(infinite)、NULL や不可能値については、欠損データの処理 の章を参照してください。データのインポート時に欠損値を変換する方法を学ぶには、データのインポート・エクスポート の章をご覧ください。

数学と統計

このセクションに記載されているすべての演算子と関数は、base R パッケージを使用することで自動的に利用可能になります。

算術演算子

算術演算子は、加算や除算の際や、新しい列の追加の際などによく用いられます。以下は、R において共通に用いられる算術演算子です。演算子の前後に半角スペースを挿入するかどうかは、重要ではありません。

目的 R での例
加算 2 + 3
減算 2 - 3
乗算 2 * 3
除算 30 / 5
べき乗 2^3
演算子の処理順 ( )

算術演算子

目的 関数
丸め(訳注: 四捨五入ではない) round(x, digits = n)
丸め(訳注: 四捨五入) janitor::round_half_up(x, digits = n)
ceiling(切り上げ) ceiling(x)
floor(切り捨て) floor(x)
絶対値 abs(x)
二乗根 sqrt(x)
べき乗 exponent(x)
自然対数 log(x)
log10(常用対数) log10(x)
log2(二進対数) log2(x)

注釈:round()digits = 引数は、小数点以下の桁数を指定します。signif() を使用すると、有効数字に丸めることができます。

科学的数法

科学的数法が使われるかどうかは、scipen オプションの値に依存します。

?options のヘルプドキュメントより:scipen は、数値を固定記法または指数記法のいずれで出力するかを決定する際に適用されるペナルティ値です。正の値の場合は固定記法に、負の値の場合は科学的記法で出力されます。つまり、適用される数値が scipen 桁幅以上ではない場合に固定記法が優先されます。

scipen オプションが少ない数値(例:0)に設定されている場合、常に「適用」されます。現在の R セッションで科学的数法を「適用しない」ようにしたい場合は、このオプションの値を非常に大きい値に設定します。例えば、以下のように設定します。

# 科学的数法を適用しない
options(scipen=999)

丸め

要注意 round() 関数は、「銀行型丸め」(訳注: 最接近偶数への丸め)を行います。つまり、(端数が0.5の場合は)1 つ上の数が偶数である場合のみ、切り上げます。常に四捨五入したい場合は、junitor パッケージの round_half_up() を使用してください。詳しくは、こちらのドキュメントをご覧ください。

# あなたの意図に適した丸めを実行してください
round(c(2.5, 3.5))
## [1] 2 4
janitor::round_half_up(c(2.5, 3.5))
## [1] 3 4

統計関数

注意 以下の関数は、デフォルトの設定では、計算時に欠損値を含めます。欠損値は、na.rm = TRUE 引数を指定しない限り、出力時に NA が結果として出力されます。省略記法では、na.rm = T と記述されます。

目的 関数
mean(平均値) mean(x, na.rm=T)
中央値 median(x, na.rm=T)
標準偏差 sd(x, na.rm=T)
分位数* quantile(x, probs)
総和 sum(x, na.rm=T)
最小値 min(x, na.rm=T)
最大値 max(x, na.rm=T)
数値の範囲 range(x, na.rm=T)
要約統計量** summary(x)

注釈:

  • *quantile()x 変数は、分位数を計算する対象の数値ベクトルです。probs = 引数には、0 から 1.0 の範囲で確率に対応する数値ベクトルを指定できます。(例:c(0.5, 0.8, 0.05)
  • **summary(): この関数は、数値ベクトルの平均値、中央値、共通の分位数を含む統計的要約を出力します。

要注意上記の関数に数値ベクトルを渡す場合は、数値を c() 関数で囲んでいることを確認してください。

# 生の数値を関数に渡す場合、c() 関数で囲む
mean(1, 6, 12, 10, 5, 0)    # !!!間違った表記!!!
## [1] 1
mean(c(1, 6, 12, 10, 5, 0)) # 正しい表記
## [1] 5.666667

その他に有用な関数

目的 関数
連続する数値を作成する seq(開始, 終了, 間隔) seq(1, 10, 2)
x を n 回繰り返す rep(x, n 回) rep(1:3, 2) or rep(c("a", "b", "c"), 3)
数値ベクトルを区切る cut(x, n) cut(linelist$age, 5)
無作為(ランダム)にサンプルを取得する sample(x, size) sample(linelist$id, size = 5, replace = TRUE)

%in%

値のマッチング(ベクトルやデータフレーム内に値があるかどうか)をすばやく評価するために非常に有用な演算子です。

my_vector <- c("a", "b", "c", "d")
"a" %in% my_vector
## [1] TRUE
"h" %in% my_vector
## [1] FALSE

ある値がベクトル内 %in%無いかどうかを確かめるためには、論理式の直前に感嘆符(!)をつけます。

# 論理式を否定する場合は、直前に感嘆符を置く
!"a" %in% my_vector
## [1] FALSE
!"h" %in% my_vector
## [1] TRUE

%in% は、dplyrcase_when() を使用する際にとても便利です。前もってベクトルを定義しておくと、後ほどそれを参照できます。例えば、以下のように使用します。

affirmative <- c("1", "Yes", "YES", "yes", "y", "Y", "oui", "Oui", "Si")

linelist <- linelist %>% 
  mutate(child_hospitaled = case_when(
    hospitalized %in% affirmative & age < 18 ~ "Hospitalized Child",
    TRUE                                      ~ "Not"))

注釈:stringr パッケージの str_detect() を使用して、文字列の一部を検出したい場合、c("1", "Yes", "yes", "y") のような文字ベクトルは引数として渡せません。代わりに、正規表現で書かれた “1|Yes|yes|y” のように、OR バー演算子(|)で構成された文字列を与えなければなりません。例えば、str_detect(hospitalized, "1|Yes|yes|y") のように記述します。詳しくは、文字型・文字列型データ の章を参照してください。

文字ベクトルを、以下のコマンドで名前付きの正規表現に変換可能です。

affirmative <- c("1", "Yes", "YES", "yes", "y", "Y", "oui", "Oui", "Si")
affirmative
## [1] "1"   "Yes" "YES" "yes" "y"   "Y"   "oui" "Oui" "Si"
# コンデンスを実行
affirmative_str_search <- paste0(affirmative, collapse = "|")  # base R を使用
affirmative_str_search <- str_c(affirmative, collapse = "|")   # stringr を使用

affirmative_str_search
## [1] "1|Yes|YES|yes|y|Y|oui|Oui|Si"

3.13 エラーと警告

このセクションでは以下について解説します。

  • エラー(error)と警告(warning)の違い
  • R コードを書く際の一般的な構文のヒント
  • コードアシスト機能

よくあるエラーと警告、そしてトラブルシューティングのヒントを知りたい方は、よくあるエラー の章をご覧ください。

エラーと警告

コマンドを実行すると、R コンソールが赤い文字で警告やエラーメッセージを表示するかもしれません。

  • 警告(warning) は、R はコマンドの実行を完了したが、追加のステップが必要もしくは、実行者が知るべき、通常にはない出力があることを意味します。

  • エラー(error) は、R はコマンドの実行を完了できなかったことを意味します。

解決のための手がかりを探す際には、以下を参考にしてください。

  • エラーや警告メッセージは、通常、何行目で問題が発生しているかを教えてくれます。

  • オブジェクトが、“is unknown” や、“not found” であると表示されているならば、オブジェクトの名前が間違っている(スペルミスなど)可能性や、library() でパッケージを読み込んでいない可能性、または、スクリプトに変更を加えたがスクリプトを再実行していない可能性が考えられます。

それでも解決できない場合は、エラーメッセージをいくつかのキーワードとともにコピーして Google で検索してください。すでに他の誰かが解決しているかもしれません!

一般的な構文のヒント

R でコマンドを記述する際にエラーや警告を発生させないために、知っておくとよい点を以下にいくつか挙げます。

  • 常に括弧を閉じる。ヒント:各コードチャンクで開き括弧 “(” と閉じ括弧 “)” の数を数える。
  • 列やオブジェクトの名前にはスペースを入れない。代わりにアンダースコア( _ )や、ピリオド( . )を使用する。
  • 関数の引数をコンマで区切ることを意識し、念頭に置く。
  • R は大文字と小文字を区別するため、Variable_Avariable_A区別される

コードアシスタント機能

いかなるスクリプトでも(RMarkdown やそれ以外でも)、もしコードに誤りがあった場合は、スクリプトが誤りを解決する手がかりを提示してくれます。例えば、コンマが必要な箇所に入力を忘れた場合や、括弧を閉じ忘れた場合、RStudio は対象の行の右側に警告用のフラグを立てます。