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
1.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
1.2 行と列の追加
行の追加はrbind
、列の追加はcbind
で行います。
A B
a 1 3
b 2 4
-1 -2
A B
a 1 3 -1
b 2 4 -2
2 行列の情報
行列は、要素数、行数、列数、行名、列名の情報を取ることができます。
[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"
2.1 行列であるかの判別
is.*
が用意されています。
[1] TRUE
[1] FALSE
クラスも定義されています。
[1] "matrix" "array"
3 行列の要素の参照と代入
行列の要素は行番号と列番号はもちろん、行名と列名でも参照可能です。
# 行列を作成
# 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
3.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
4 行列の演算
統計学の教科書で使うような演算ができます。
[,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
を使います。
4.1 行列とベクトルの演算
行列をベクトルとして扱った後、行列に戻されます。
4.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
4.3 行列式
行列式を求める関数が用意されています。
[,1] [,2] [,3] [,4] [,5]
[1,] 2 9 7 9 8
[2,] 3 1 9 2 5
[3,] 6 7 6 9 4
[4,] 3 7 1 9 4
[5,] 3 7 3 9 8
[1] 952
もちろん正方行列にしか使えません。
4.4 固有値と固有ベクトル
固有値と固有ベクトルの計算をする関数も用意されています。
eigen() decomposition
$values
[1] 27.1415660+0.000000i 3.8041610+0.000000i -2.9010408+1.533242i
[4] -2.9010408-1.533242i 0.8563547+0.000000i
$vectors
[,1] [,2] [,3]
[1,] -0.5376200+0i 0.09899042+0i -0.06718980-0.57317529i
[2,] -0.3500066+0i 0.44604030+0i 0.66134167+0.00000000i
[3,] -0.5050717+0i 0.53225033+0i -0.14014457+0.28403677i
[4,] -0.3526038+0i -0.24537788+0i -0.34063206+0.07489185i
[5,] -0.4572016+0i -0.66913992+0i -0.08715725+0.00548165i
[,4] [,5]
[1,] -0.06718980+0.57317529i 0.3874092+0i
[2,] 0.66134167+0.00000000i 0.5115881+0i
[3,] -0.14014457-0.28403677i -0.1353872+0i
[4,] -0.34063206-0.07489185i -0.7020817+0i
[5,] -0.08715725-0.00548165i 0.2773867+0i
[1] 952+0i
5 比率に変換
比率に変換できます。
[,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
6 行列の中から指定した要素の位置を特定する
行列の場合はarr.ind=TRUE
オプションをつけておくと、which
で行番号と列番号をそれぞれ得られます。
[,1] [,2] [,3]
[1,] 11 4 10
[2,] 6 5 9
[3,] 1 2 8
[4,] 3 12 7
row col
[1,] 2 1
[1] 6
7
配列(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次元を取り出すと、行列になります。