Rの行列と配列の扱い方のざっとした説明
CやFortranでは行列といっても多次元配列があるだけで、行列としての操作はサポートされていないのですが、Rでは行列の演算が標準で提供されています。
1 行列の作成
行列の成分となるベクトルと、行数と列数のどちらかがあれば行列をつくれます。両方指定しても問題ないです。
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
ベクトルの要素は列ごとに割り当てていきますが、byrow = TRUEをつけると行ごとに使っていきます。
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
作成時に名前をつけることもできます。行名だけ、列名だけをつけることもできます。
A B
a 1 3
b 2 4
[,1] [,2]
a 1 3
b 2 4
A B
[1,] 1 3
[2,] 2 4
2 行列をベクトルに変換
行列にas.vectorを用いるとベクトルに戻ります。
[1] 1 2 3 4
dropは1行n列の行列とn行1列の行列の場合はベクトルに戻し、そうでない場合は変化させない関数です。
A B
a 1 3
b 2 4
[1] 1 2 3 4 5 6 7 8 9
2.1 対角行列
対角行列の作成はdiagと言う関数を使うと便利です。
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
引数に数字ひとつを入れると、その大きさの単位行列になりますが、複数にすると対角成分として使います。
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 2 0
[3,] 0 0 3
2.2 行と列の追加
行の追加はrbind、列の追加はcbindで行います。
A B
a 1 3
b 2 4
-1 -2
A B
a 1 3 -1
b 2 4 -2
3 行列の情報
行列は、要素数、行数、列数、行名、列名の情報を取ることができます。
[1] 4
[1] 2
[1] 2
[1] "a" "b"
[1] "A" "B"
$dim
[1] 2 2
$dimnames
$dimnames[[1]]
[1] "a" "b"
$dimnames[[2]]
[1] "A" "B"
3.1 行列であるかの判別
is.*が用意されています。
[1] TRUE
[1] FALSE
クラスも定義されています。
[1] "matrix" "array"
4 行列の要素の参照と代入
行列の要素は行番号と列番号はもちろん、行名と列名でも参照可能です。
# 行列を作成
# lettersはアルファベットが並んだビルトイン配列、toupperは大文字にする関数
(m <- matrix(1:9, 3, dimnames = list(letters[1:3], toupper(letters[1:3])))) A B C
a 1 4 7
b 2 5 8
c 3 6 9
[1] 8
[1] 8
A B C
1 4 7
A B C
1 4 7
a b c
7 8 9
a b c
7 8 9
[1] 5
A C
a 1 7
c 3 9
[1] 1 2 3 4 5 6 7 8 9
参照と同様に代入することができます。
A B C
a 8 3 4
b 2 9 7
c 5 6 1
A B C
a 0 3 0
b 2 9 7
c 0 6 0
A B C
a 0 3 0
b 2 9 7
c 0 6 NA
NAを入れましたが、Infなども入ります。
diagを使うと対角成分に代入もできます。
A B C
a 1.1 3.0 0.0
b 2.0 2.2 7.0
c 0.0 6.0 3.3
4.1 行と列の削除
ベクトルと同様に行番号や列番号をマイナスにすると、その行や列を削除した行列になります。
A B C
a 1.1 3 0.0
c 0.0 6 3.3
A C
a 1.1 0.0
b 2.0 7.0
c 0.0 3.3
A C
a 1.1 0.0
c 0.0 3.3
残す行と列のみを選択するのも方法です。
A B C
a 1.1 3 0.0
c 0.0 6 3.3
A C
a 1.1 0.0
b 2.0 7.0
c 0.0 3.3
A C
a 1.1 0.0
c 0.0 3.3
5 行列の演算
統計学の教科書で使うような演算ができます。
[,1] [,2] [,3]
[1,] 2 4 7
[2,] 2 6 8
[3,] 3 6 10
[,1] [,2]
[1,] 1 3
[2,] 2 4
[,1] [,2]
[1,] 1 2
[2,] 3 4
[,1] [,2]
[1,] -22 -49
[2,] -28 -64
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
[,1] [,2] [,3] [,4]
[1,] 1 3 0 0
[2,] 2 4 0 0
[3,] 0 0 1 3
[4,] 0 0 2 4
, , 1, 1
[,1]
[1,] -1
[2,] -2
, , 2, 1
[,1]
[1,] -2
[2,] -4
なお、solveはX %*% beta = yのとき、solve(X, y)としたらbetaを出す連立方程式を計算する関数で、yのデフォルトが単位行列になっています。
上三角を操作したい場合は、upper.triを使います。
5.1 行列とベクトルの演算
行列をベクトルとして扱った後、行列に戻されます。
5.2 下三角と上三角
まとめて操作するための関数があります。真偽値を戻し、diagで対角成分を含めるか否かを指定できます。
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 2 7 0 0 0
[3,] 3 8 13 0 0
[4,] 4 9 14 19 0
[5,] 5 10 15 20 25
5.3 行列式
行列式を求める関数が用意されています。
[,1] [,2] [,3] [,4] [,5]
[1,] 3 9 1 6 7
[2,] 7 5 7 6 5
[3,] 4 7 3 5 6
[4,] 8 9 4 4 6
[5,] 2 1 8 2 5
[1] -90
もちろん正方行列にしか使えません。
5.4 固有値と固有ベクトル
固有値と固有ベクトルの計算をする関数も用意されています。
eigen() decomposition
$values
[1] 25.84087434 -5.92425881 2.83133146 -2.67018466 -0.07776233
$vectors
[,1] [,2] [,3] [,4] [,5]
[1,] 0.4455040 0.7617609 -0.09753400 -0.18726609 0.378549441
[2,] 0.5120414 -0.4780422 -0.39467630 -0.42116158 -0.562662479
[3,] 0.4246223 0.3000689 -0.06031832 -0.06975974 -0.412567690
[4,] 0.5291680 -0.1245552 -0.36817177 0.88306157 0.009094554
[5,] 0.2810997 -0.2926442 0.83398380 -0.05376031 0.608125353
[1] -90
6 比率に変換
比率に変換できます。
[,1] [,2]
[1,] 0.1 0.3
[2,] 0.2 0.4
[,1] [,2]
[1,] 0.2500000 0.7500000
[2,] 0.3333333 0.6666667
[,1] [,2]
[1,] 0.3333333 0.4285714
[2,] 0.6666667 0.5714286
7 行列の中から指定した要素の位置を特定する
行列の場合はarr.ind=TRUEオプションをつけておくと、whichで行番号と列番号をそれぞれ得られます。
[,1] [,2] [,3]
[1,] 9 2 4
[2,] 1 11 10
[3,] 5 3 8
[4,] 7 12 6
row col
[1,] 4 3
[1] 6
8
配列(array)
行列はベクトルを2次元配列と見なすものでしたが、3次元以上の配列と見なす事もできます。
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
, , 3
[,1] [,2] [,3]
[1,] 13 15 17
[2,] 14 16 18
, , 4
[,1] [,2] [,3]
[1,] 19 21 23
[2,] 20 22 24
(a <- array(1:24, c(2, 3, 4), dimnames = list(c("a", "b"), c("A", "B", "C"), c("alpha", "beta", "gamma", "delta")))), , alpha
A B C
a 1 3 5
b 2 4 6
, , beta
A B C
a 7 9 11
b 8 10 12
, , gamma
A B C
a 13 15 17
b 14 16 18
, , delta
A B C
a 19 21 23
b 20 22 24
行列と同様に参照と代入と演算ができます。%*%や%x%や%o%も定義されています。また、多次元配列のうち2次元を取り出すと、行列になります。
