Rはオープンソースの統計処理ソフトウェアです.
Ross Ihaka氏とRobert Clifford Gentleman氏によって開発されたR言語の実装にあたります.

Rは統計モデルを記述する上での見通しの良さに突出しており,ベクトル・行列の計算,欠損データの取り扱い,多様な確率分布の利用といった点でも優れています.

目次

  1. インストール
    1. CentOS 8
    2. Alpine Linux
  2. セットアップ
    1. 起動と終了
    2. 作業ディレクトリ
    3. 作業の保存・読み込み
    4. パッケージ
    5. ヘルプ
  3. 計算
    1. 基礎計算
    2. ベクトル
    3. 行列
    4. 配列
  4. データ
    1. 読み込み
    2. 書き出し
    3. リスト
    4. データフレーム
    5. 欠損値
    6. applyによる集計
    7. aggregateによる集計
  5. プログラミング
    1. if文
    2. for文
    3. 関数
    4. ラムダ式
    5. シェルからRscriptを呼ぶ
  6. 基本統計量
  7. 分布
    1. 正規分布
    2. t分布
    3. 一様分布
    4. 二項分布
  8. 集計表
    1. グループごとの度数分布
  9. 標本抽出
  10. モデルの記述
  11. 参考文献

インストール

CentOS 8

CentOS 8でのインストールは次のようにします.
CentOS公式のフォーラムでの回答による.)

dnf config-manager --set-enabled PowerTools
dnf install R

Alpine Linux

iPhoneのアプリであるiShにてインストールする方法です.
iShはAlpine Linux 3を採用しているため,

apk add R

とします.

セットアップ

以下の環境あたりでの例です.

  • CentOS 8, R 3.4 / macOS 11, R 4.1

起動と終了

シェルからはRコマンドでRが起動し,Rはq()コマンドで終了します.

作業ディレクトリ

作業ディレクトリの取得・設定は以下のように行います.

getwd()
setwd("パス")

作業ディレクトリに含まれるファイルを一覧するには,

dir()

とします.

作業の保存・読み込み

オブジェクトの保存は,

save(オブジェクト名, file=ファイル名)

です.
作業全体を保存するには

save.image(ファイル名)

とします.
読み込みは

load(ファイル名)

で行います.

パッケージ

パッケージのダウンロード先として適当なミラーサイトを設定するには,

options(repos="ミラーサイトのURL")

とします.
例えば,国内のoptions(repos="https://cran.ism.ac.jp/")が指定できます.

インストールはinstall.packages()によって行います.

install.packages(パッケージ名, dep=T)

ここで,dep=Tは依存関係にあるものも一緒にインストールするオプションです.
パッケージのアップデートはupdate.packages()で行えます.

インストールされたパッケージはlibrary()で読み込んで使用します.

library(パッケージ名)

読み込んだパッケージの一覧を出力するには,

search()

とします.

ヘルプ

?をコマンドの前につけてヘルプを見ることができます.
例えば,summaryというコマンドの使い方を知りたい場合は

?summary

とします.
使用するコマンドが採用しているデフォルトの分析手法を確認するようにしましょう.

計算

基礎計算

四則演算は通常のもので,特に整数商と剰余の演算子は次の通りです.

  • 整数商 %/%
  • 剰余 %%

基本的な関数には以下のものがあります.

  • 平方根 sqrt(x)
  • 小数点以下切り上げ・切り捨て ceiling(x)floor(x)
  • 積分 integrate(dnorm, -Inf, Inf)(正規分布でマイナス無限大からプラス無限大まで積分する例)

代入は=よりも<-が推奨されます.
変数xをクリアするにはrm(x)と書きます.

ベクトル

ベクトルはc(1,2)のように書きます.
規則的に生成することも可能です.

  • 1:3c(1,2,3)
  • seq(x, y, by = z)xからyまでzおきに
  • seq(x, y, length = n)xからyまでn分割して

xがベクトルであるとき,その要素を取り出すことができます.

x[-2]  # 第2要素を取り除いて作ったベクトル
x[x > 0] # 正の値のみ取り出したベクトル
x[x < 0 | 10 < x] # ベクトルxの要素が,x<0または10<xであるような要素からなるベクトル

全ての要素が文字列であるようなベクトルを作ることもできるので,Rにおけるベクトルは柔軟な概念だと言えます.
さらに,ベクトルは集合とみなして操作することができます.

  • ソート sort(x)
  • 結合 append(x,y)
  • 要素の一意化 unique(x)
  • 和集合 union(x,y)
  • 積集合 intersect(x,y)
  • 差集合 setdiff(x,y)
  • 集合が等しいか setequal(x,y)
  • ベクトルxの要素がベクトルyに含まれるか is.element(x,y)

行列

行列は次のように記述します.

matrix(ベクトル, nrow=行数 , ncol=列数)

ベクトルまたは行列matの要素に合致するように,後から行数・列数を定めることもできます.

dim(mat) <- c(行数, 列数)

行列matがあるとき,行数・列数を調べるにはnrow()ncol()を使います.

nrow(mat)  # 行数
ncol(mat) # 列数

2つの列ベクトルxyをつなげて行列を作るには,

cbind(x, y)

とします.
行ベクトルではrbind(x, y)です.

一部の行や列を取得するのを簡単にするため,行や列に命名することができます.

rownames(mat) <- c(それぞれの行名)
colnames(mat) <- c(それぞれの列名)

行列の代表的な計算は次の通りです.

  • 行列の積 mat1 %*% mat2
  • 転置 t(mat)
  • 行列式 det(mat)
  • 逆行列 solve(mat)
  • 固有値・固有ベクトル eigen(mat)
  • 各列の平均 colMeans(mat)

配列

3次元配列の例です.

array(1:8, dim=c(1,2,4))

出力は以下のようになります.

, , 1

[,1] [,2]
[1,] 1 2

, , 2

[,1] [,2]
[1,] 3 4

, , 3

[,1] [,2]
[1,] 5 6

, , 4

[,1] [,2]
[1,] 7 8

データ

読み込み

見出し行のあるテキストを変数datに読み込むには

dat <- read.table("ファイルパス", header=T)

とします.
デフォルトはタブ区切りテキストの読み込みです.
オプションでsep=","とすると,CSVとして読み込みます.

CSVには

read.csv(ファイル名)

も使用できます.

書き出し

変数datを書き込むには

write.table(dat, "ファイルパス", quote=F)

とします.

オプションをquote=Tとすると,要素にダブルクオーテーションがつきます.

また,append=Tオプションで追記となります.
見出しを消して追記するには,あわせてcol.names=Fオプションが必要です.

CSVは

write.csv(ファイル名)

で書き出せます.

isasを用いて型を判定・変換します.
次は整数型の例です.

  • is.integer(x)xが整数型であるかどうかの論理値を返す.
  • as.integer(x)xを整数型に変換する.

同様に,文字列についてis.character(),論理値についてis.logical()があります.
論理値の型変換では0ならFALSE0でない数はTRUEとなります.

また,isasはデータ構造にも使われます.
例えば,is.vector(x)でxがベクトルであるかどうかを判定できます.

数値ベクトルxを因子型にデータを変換したい場合には,

x <- factor(x)

とします.

リスト

配列と異なり,リストでは異なる型のデータをまとめることができます.

例えば,

list(c(1,2), "test")

は,次の内容を保持します.

[[1]]
[1] 1 2

[[2]]
[1] "test"

names属性を与えると見易くなります.
例えば,

x <- list("apple", 100)
names(x) <- c("item", "price")

とすると,

x$item

で,appleが返ります.

リスト作成時に命名するなら,

x <- list("item"="apple", "price"=100)

と書きます.

データフレーム

データフレームは行列のような2次元配列の形をしたリストのことです.
data.frameで作成します.
例えば,

job <- c("knight", "knight", "wizard")
hp <- c(200, 400, 100)
mp <- c(50, 20, 150)
dat <- data.frame(Job=job, HP=hp, MP=mp) # 見出し=ベクトルという形式の引数

であるとき,dat$HPとしてdatの要素であるところのベクトルhpを呼ぶことができます.

データフレームの長所はデータの断面を取得するのが容易になることです.
dat$層名の記法で層を切ることができるので,例えばJobごとに断面をとって集計するには,

by(dat, dat$Job, summary)

とします.

リスト名を省略,すなわち,dat$HPとせずともHPのみで参照できるようにしたいなら,

attach(dat)

とします.
この解除はdettach(dat)です.

2つのデータフレームdat1dat2をマージするには,

merge(dat1, dat2, all=T)

とします.
欠損値にはNAが入ります.

両方のデータフレームに存在する列を参照して,いずれにも存在するデータでマージするには,オプションをall=Fにします.

all=all.xなら左結合します.
つまり,dat1を土台とするので,dat2から結合した部分にNAが入るかもしれません.
all=all.yなら右結合します.
dat2を土台とするので,dat1から結合した部分にNAが入るかもしれません.

一部の列のみを参照して紐づけるなら,by.xまたはby.yオプションを使います.
このオプションは,各データフレームにおける見出しが異なることを許容します.
例えば,by.x="ID", by.y="アイディー"とすれば,2つのデータフレームの間でこれらが同じことを意味する列であると認識されます.

str(データフレーム)の形でその構造を調べることができます.

欠損値

欠損値を除去するにはis.na(x)による型判定を利用するほか,関数

omit.na(x)

による除去,もしくは,コマンドのオプションを利用する(例えば,

mean(x, na.rm=T)

とする)という方法があります.

applyによる集計

apply()はマップによる操作を行えます.
matが行列であるとき,

apply(mat, マージン, 関数)

として,mat中の指定した部分それぞれについて関数を適用します.
ここで,マージンが1なら行,2なら列,c(1,2)なら要素を対象とします.

例えば,

apply(mat, 1, sum)

とすると,各行の和をそれぞれ返します.

aggregateによる集計

いくつかの断面をもとにデータを合計する例です.
byと異なり,aggregateはデータフレームを返す点が優れています.

aggregate(x, by=list(断面1, 断面2, ... ), sum)

プログラミング

if文

ifelse(条件式, 真の場合に返す値, 偽の場合に返す値)

for文

for(i in 1:10){
処理
}

関数

関数名 <- function(x){
y <- xの関数 # ローカルな代入
return y
}

グローバル変数に代入を行うには<<-を使います.
ローカル変数とグローバル変数が同じ名前だと,関数内ではそれぞれ別物に扱われるので,代入時に注意が必要です.
function(x=1){}のようにして,初期値を設定することができます.

ラムダ式

apply(dat, 2, function(x){ xを使った式 })

のような書き方ができます.

シェルからRscriptを呼ぶ

Rのダイアログの中で書くまま動かせるという例です.

rscript -e "x <- c(1,2); 2 * x;"

基本統計量

x, yがベクトルであるとき,基本統計量には以下のようなものがあります.

  • 合計 sum(x)
  • 平均 mean(x)
  • 不偏分散 var(x)
  • 標準偏差 sd(x)(不偏分散より導出される)
  • 不偏共分散 cov(x, y)
  • 中央値 median(x)
  • 中央絶対偏差 mad(x)
  • 最頻値 names(which.max(table(x)))
  • データの個数 length(x)
  • 最大値 max(x)
  • 最小値 min(x)
  • 四分位点 quantile(x)
  • 四分位範囲 IQR(x)
  • 範囲 range(x)

要約統計量は

summary(x)

で得られます.
psychパッケージの

describe(x)

を使うと,データ数やトリム平均,歪度等も得られます.

分布

r(random:乱数)・d(distribution:確率密度),p(probability:p値,累積分布),q(quantity:pに対する確率点)を接頭辞として,分布の名称を続けます.

例えば,正規分布はnormを続けるので,rnorm()が正規分布における乱数の発生を意味します.
以下は,いくつかの例です.

正規分布

平均mean,標準偏差sdとします.

rnorm(n, mean, sd)
dnorm(x, mean, sd)
pnorm(q) # 下側確率p = Prob(Z < q)
qnorm(p)

上側確率についてはpnorm(q, lower.tail=FALSE)で求められます.

ベクトルxを標準化するには,

scale(x)

とします.
ベクトルxを使って,偏差値を作るなら

10 * scale(x) + 50

です.

t分布

正規分布と似ており,自由度dfであるとき,

rt(n, df)
dt(x, df)
pt(q, df)
qt(p, df)

です.

一様分布

最小値min,最大値maxであるときのn個の乱数を発生させるには,

runif(n, min, max)

とします.

二項分布

その回数でオモテが出る確率は次の通りです.

dbinom(オモテが出た回数, コインを投げた回数, オモテが出る確率)

集計表

集計表は

table(v)

と書き,クロス集計表であれば

table(v1,v2)

となります.

グループごとの度数分布

Xという断面でグループ化したデータxの度数分布表

x <- factor(dat$X)
table(x)

ここで,factor関数で要因型ベクトルへの変換を行なっています.

指定された項目についてグループごとの平均をとるには,apply関数のバリエーションであるtapply関数を用いて

tapply(項目名, x, mean)

とします.

標本抽出

ベクトルの要素からの非復元抽出は次の通りです.

sample(ベクトル, 抽出回数)

復元抽出を行うには,replace=Tのオプションを入れます.

モデルの記述

目的変数y,説明変数xであるとき,Rでは(多くの場合)

y ~ x

のように書きます.
この記法による式をformula式といいます.

説明変数の追加は+で結合します.

y ~ x1 + x2

x1とx2の交差効果は:で表現します.

y ~ x1 + x2 + x1:x2

交差効果を検討する場合は,それぞれの説明変数もモデルに含めるべきです.
このため,上式と同じことを*で短く書けるようになっています.

y ~ x1 * x2

参考文献

Rによる統計学の入門書です.

  • 山田剛史ら (2008)「Rによるやさしい統計学」オーム社.

Rの概説書です.

  • 舟尾暢男 (2016)「The R Tips ― データ解析環境Rの基本技・グラフィックス活用集」3版,オーム社.