このページでは、Rの基本的な使い方を解説する。 Rの使い方以前のインストール等の問題については、Rjp Wiki を参照。
RのコードはRのConsoleに直接入力してもいいし、スクリプトに保存してRから呼び出してもよい。 スクリプトを使うときは、スクリプトファイルをファイル名.R のように .R ファイルとして保存する。そして、RのConsole でsource(ファイル名.R)
とすれば、スクリプトが実行される。
Rコマンドの区切りは改行である。改行すれば、1つのコマンドが終了したと認識される。 ただし、括弧が閉じていなかったり、行末に二項演算子 (+ など) があるときは、コマンドが次の行まで続いていると認識される。1行に複数のコマンドを書きたいときは ;
で区切る。
Rは大文字と小文字を区別する。したがって、Var1 と var1 は異なる変数として認識される。 変数名は英数字(. [ピリオド] と _ [アンダースコア]も可)にする。ただし、頭文字に数字は使えない。
スペースは1つ以上ならいくつあっても1つのスペースがある場合と同じである。また、演算子の前後のスペースはあってもなくてもよいが、コードの読み易さを考慮してスペースを入れたほうがよい。
#
(ハッシュ)はコメントの開始として扱われる。行頭に#
を書くと、その行すべてがコメントとして扱われる。 行の途中に#
を書くと、#
以降がコメントとして扱われる。(コメントを書く作業は、コマンドを書く作業と同様に大切である。詳しくは第3回の授業で説明する。)
Rに用意されている関数の使い方についてHelp を参照したいときは?関数名
(またはhelp(関数名)
) とする。ウェブブラウザでHelpを参照したいときは、help.start()
とする。
インストール済みのパッケージを利用するときは、library("パッケージ名")
とする。たとえば、ggplot2 パッケージを使いたいなら、library('ggplot2')
とする。パッケージをインストールする際は、install.packages('パッケージ名')
とする。その際、どのレポジトリからダウンロードするか尋ねられるので、自分に一番近いところ選ぶ。(パッケージをインストールする度にレポジトリを指定するのが面倒なら、.Rprofile であらかじめレポジトリを指定しておく。)
Rは電卓の代わりとして使うことができる。 たとえば、
## [1] 2
## [1] 80
## [1] 40
## [1] 0.6666667
## [1] 8
## [1] 1.414214
## [1] 1.414214
などの計算ができる。 計算の順番を指定するときは、() で囲めばよい。
## [1] 3375
Rでは、オブジェクトを(ある程度)自由に作ることができる。 オブジェクトの名前は自由に決めてよい(ただし、数字から始まるものはだめ。また、“-” [ハイフン] はマイナスと区別できないので使えない)。 たとえば、
とすると、\(a\), \(b\) という2つのオブジェクトができる。ここで <-
はオブジェクトに値を割り当てることを意味する。RStudioで <-
を入力するには、Optionキーと “-” (マイナス) を同時に押す。(<-
の代わりに=
を使うこともできるが、混乱の元になるので、オブジェクトを定義するときは常に<-
を使うことにする。) ここでオブジェクト名を入力すると、オブジェクトの中身が表示される。
## [1] 1
## [1] 2
作ったオブジェクトは、計算に使える。
## [1] 3
## [1] -1
## [1] 2
## [1] 0.5
## [1] 2
また、
とすると、\(c = 1\), \(a = 3\) となる(各自確かめること)。
また、オブジェクト名には日本語も使える。 たとえば、
## [1] 35
とすることも可能である。しかし、オブジェクト名に日本語を使うと、(1)英語/日本語の切り替えが面倒であり、(2)文字化け等の予期せぬ問題が生じることがあるので、なるべく日本語のオブジェクト名は使わないほうが無難である。
オブジェクトの作成とオブジェクトの中身の画面出力を同時に行いたいときは、全体を ()
で囲む。
## [1] 15
オブジェクトを消去したいときはrm()
関数を使う。
Rで特定のベクトル (vector) を作りたいときは、c()
を使う。 たとえば、1, 2, 3, 4, 5 という5つの数字からなるベクトル a を作るには、
とする。このベクトルを画面に表示すると、
## [1] 1 2 3 4 5
となる。
ベクトルの中身は文字列でもかまわない。 たとえば、
とすれば、文字列 (characters) のベクトルができる。 このように、文字列は引用符(''
でも""
でもよい)で囲む。
ひとつひとつの要素を指定する代わりに、様々な方法でベクトルを作ることが可能である。 たとえば、seq()
関数を使うと、一連の数字からなるベクトルを作ることができる。
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## [1] 1 3 5 7 9 11 13 15 17 19
## [1] 2 4 6 8 10 12 14 16 18 20
## [1] 20 15 10 5
## [1] 1 12 23 34 45 56 67 78 89 100
seq(x, y, by = 1)
の場合はより単純に x:y
とすればよい。
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
また、rep()
関数も便利である。
## [1] 3 3 3 3 3 3 3 3 3 3
## [1] "a" "a" "a" "b" "c" "c"
ベクトルの\(i\)番目の要素にアクセスするにはベクトル名[i]
とする。 同時に複数の要素を取り出すこともできる。 たとえば、
## [1] 20
## [1] 9
## [1] 30 40 50
## [1] 10 30 50
## [1] 80 20 40
Rでは、ベクトルを使った演算が可能である。 たとえば、次のような計算ができる。
## [1] 11 12 13 14 15 16 17 18 19 20
## [1] -4 -3 -2 -1 0 1 2 3 4 5
## [1] 2 4 6 8 10 12 14 16 18 20
## [1] 0.3333333 0.6666667 1.0000000 1.3333333 1.6666667 2.0000000 2.3333333
## [8] 2.6666667 3.0000000 3.3333333
## [1] 1 4 9 16 25 36 49 64 81 100
## [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751
## [8] 2.828427 3.000000 3.162278
また、複数のベクトルを使って、次のような計算ができる。
## [1] -9 -7 -5 -3 -1 1 3 5 7 9
## [1] 11 11 11 11 11 11 11 11 11 11
## [1] -10 -18 -24 -28 -30 -30 -28 -24 -18 -10
## [1] -0.1000000 -0.2222222 -0.3750000 -0.5714286 -0.8333333
## [6] -1.2000000 -1.7500000 -2.6666667 -4.5000000 -10.0000000
## [1] 1.000000e+00 1.953125e-03 1.524158e-04 6.103516e-05 6.400000e-05
## [6] 1.286008e-04 4.164931e-04 1.953125e-03 1.234568e-02 1.000000e-01
ベクトル同士の足し算(引き算)をしても、ベクトルの長さは変わらない。
## [1] 10
## [1] 10
## [1] 10
長さの異なるベクトルを使って演算を行うと、短いの方のベクトルは要素をリサイクルして対応する。
## [1] 101 202 103 204 105 206 107 208 109 210
ただし、長い方のベクトルの長さが短い方のベクトルの長さの整数倍になっていないときは、警告文が出る。
## Warning in x + y: longer object length is not a multiple of shorter object
## length
## [1] 101 202 303 104 205 306 107 208 309 110
2つのベクトルの内積 (dot product) は%*%
で、直積 (outer product) は%o%
またはouter()
で求められる。
## [,1]
## [1,] 220
## [,1] [,2] [,3]
## [1,] 10 20 30
## [2,] 30 60 90
## [3,] 50 100 150
## [,1] [,2] [,3]
## [1,] 10 20 30
## [2,] 30 60 90
## [3,] 50 100 150
Rで行列を作るには、matrix()
関数を使う。 たとえば、
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
のようにする。 ここで、行列Aと行列Bの違いに注目する。 要素全体をひとつの集合としてみると、AとBの行列は全く同じである。 これは、上のコードでは1:9という部分が同じだからである。 しかし、要素の並び方が異なる。 Aを作ったコードはbyrow = TRUE となっている。 これは、行 (row) 単位でセルを埋めて行くということである。 それに対し、Bではbyrow = FALSE となっている。 これは行単位でセルを埋めない(したがって、列 [col] 単位で埋める)ということを意味する。 この違いが、AとBの違いを生み出している。 行列を作るときは行数 nrow と列数 ncol を指定するが、要素の合計数が決まっているときは、どちらか一方を指定すれば、もう一方は自動的に決められる。 上の例では、要素の数が9で、行の数に3を指定したので、列の数は自動的に 9/3 = 3 になっている。
行列の各行と各列にはそれぞれ名前を付けることができる。
row.names(A) <- c('row1', 'row2', 'row3') # 各行に名前をつける
colnames(A) <- c('col1', 'col2', 'col3') # 各列に名前をつける
A
## col1 col2 col3
## row1 1 2 3
## row2 4 5 6
## row3 7 8 9
row.names()
には’.’ があり、colnames()
にはそれがないことに注意。
行列の\(i\)行\(j\)列を取り出すには、行列名[i, j]
とする。 例えば
## [1] 3
## col1 col3
## 4 6
## col1 col2 col3
## 7 8 9
## row1 row2 row3
## 2 5 8
Rでは行列を使った計算ができる。
基本的な演算の結果は次のとおりである。
## [,1] [,2] [,3]
## [1,] 4 7 10
## [2,] 5 8 11
## [3,] 6 9 12
## [,1] [,2] [,3]
## [1,] 2 8 14
## [2,] 4 10 16
## [3,] 6 12 18
## [,1] [,2] [,3]
## [1,] -3 3 9
## [2,] -1 5 11
## [3,] 1 7 13
## [,1] [,2] [,3]
## [1,] -4 -4 14
## [2,] -6 0 24
## [3,] -6 6 36
## [,1] [,2] [,3]
## [1,] -30 6 42
## [2,] -39 6 51
## [3,] -48 6 60
## [,1] [,2] [,3]
## [1,] 0 -9 -18
## [2,] 6 6 6
## [3,] 12 21 30
## [,1] [,2] [,3]
## [1,] FALSE FALSE FALSE
## [2,] FALSE TRUE FALSE
## [3,] FALSE FALSE FALSE
## [,1]
## [1,] 30
## [2,] 36
## [3,] 42
行列の転置 (transpose) にはt()
を使う。
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
逆行列はsolve()
で求める。
## [,1] [,2] [,3]
## [1,] -0.07692308 -0.7692308 0.69230769
## [2,] -0.33333333 0.5000000 -0.16666667
## [3,] 0.20512821 -0.1153846 -0.01282051
特異行列 (a singular matrix) にsolve()
を使うとエラーになる。
## Error in solve.default(S): Lapack routine dgesv: system is exactly singular: U[3,3] = 0
エラーメッセージを読めば何がまずいのかわかるので、エラーが出たら内容をよく読むこと。 この場合は、行列が特異行列 (singular) であることを教えてくれている。
日本語版を利用している場合は、エラーメッセージも日本語で表示される(はず)。
Enjoy!