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
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,] 3 8 3 7 4
[2,] 3 7 1 9 7
[3,] 8 7 5 3 5
[4,] 5 7 1 7 7
[5,] 8 5 3 7 1
[1] -1724
もちろん正方行列にしか使えません。
4.4 固有値と固有ベクトル
固有値と固有ベクトルの計算をする関数も用意されています。
eigen() decomposition
$values
[1] 26.116507+0.000000i 3.785795+0.000000i -2.451151+1.646276i
[4] -2.451151-1.646276i -2.000000+0.000000i
$vectors
[,1] [,2] [,3] [,4]
[1,] 0.4298397+0i -0.05386765+0i 0.47029084-0.1226406i 0.47029084+0.1226406i
[2,] 0.4580369+0i 0.28907229+0i 0.22596930+0.2905922i 0.22596930-0.2905922i
[3,] 0.4770641+0i -0.91947421+0i -0.52766219+0.0000000i -0.52766219+0.0000000i
[4,] 0.4560311+0i 0.17052681+0i -0.31664285+0.1424743i -0.31664285-0.1424743i
[5,] 0.4121717+0i -0.19754310+0i -0.09249851-0.4698243i -0.09249851+0.4698243i
[,5]
[1,] -4.067259e-01+0i
[2,] -4.067259e-01+0i
[3,] 6.710978e-01+0i
[4,] 4.677348e-01+0i
[5,] 2.839277e-15+0i
[1] -1724+0i
5 行列の中から指定した要素の位置を特定する
行列の場合はarr.ind=TRUE
オプションをつけておくと、which
で行番号と列番号をそれぞれ得られます。
[,1] [,2] [,3]
[1,] 1 6 4
[2,] 10 3 5
[3,] 12 7 8
[4,] 11 2 9
row col
[1,] 1 2
[1] 6
6
配列(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
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次元を取り出すと、行列になります。