R の行列は数学の行列とほぼ同じ概念である。行と列からなる、2 次元配置のデータである。2 次元配置のデータ型は、行列のほかに、データフレームもある。行列について、行列に含まれるすべての要素が同じ属性を持つ必要がある。言い換えると、行列に含まれているすべての要素は同じ単位である必要がある。また、R では、行列に似たものでデータフレームと呼ばれる概念が存在する。データフレームは、行列とは異なり、列ごとに異なる単位を持つことができる。
行列の作成
行列は matrix
関数に行列の要素、列数、行数を指定して作成する。
matrix(1:9, nrow = 3, ncol = 3)
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
matrix(1:9, nrow = 3, ncol = 3, byrow = T)
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
行列の行と列に名前を付けることができる。
m <- matrix(1:12, nrow = 3, ncol = 4)
colnames(m) <- c("A", "B", "C", "D")
rownames(m) <- c("first", "second", "third")
m
## A B C D
## first 1 4 7 10
## second 2 5 8 11
## third 3 6 9 12
行列の要素
行列から要素を取り出すとき、角括弧を利用して、行数と列数を指定して行う。行数と列数を複数指定することで、複数の要素を取り出すことができる。また、行数だけを指定して、列数を両略する場合は、指定された行の行ベクトルを取得できる。
x <- matrix(c(1:16), nrow = 4, ncol = 4)
x
## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
## [3,] 3 7 11 15
## [4,] 4 8 12 16
x[3, 2]
## [1] 7
## x[3, ]
[1] 3 7 11 15
x[-3, ]
## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
## [3,] 4 8 12 16
x[c(1,2),c(3,4)]
## [,1] [,2]
## [1,] 9 13
## [2,] 10 14
行列の行と列に名前が付けられている場合、行名と列名で要素を取得できる。
m <- matrix(1:12, nrow = 3, ncol = 4)
colnames(m) <- c("A", "B", "C", "D")
rownames(m) <- c("first", "second", "third")
m[, "D"]
## first second third
## 10 11 12
m[c("first", "second"), c("B", "C", "D")]
## B C D
## first 4 7 10
## second 5 8 11
行列の計算
式 | 入力式 | 意味 |
- | -A | 各成分に(-1)をかける。逆行列を計算しているわけではない。 |
* | A * B | 各成分をそれぞれ個別に積をとる。すなわち、aij*bijを計算している。行列の積を計算しているわけではない。 |
%*% | A %*% B | 行列 A と行列 B の積。すなわち、Σaij*bji を計算している。 |
+ | A + B | 行列 A と行列 B の和。 |
- | A - B | 行列 A と行列 B の差。 |
A <- matrix(1:9, 3, 3)
B <- matrix(1:9, 3, 3)
A + B
## [,1] [,2] [,3]
## [1,] 2 8 14
## [2,] 4 10 16
## [3,] 6 12 18
A * B
## [,1] [,2] [,3]
## [1,] 1 16 49
## [2,] 4 25 64
## [3,] 9 36 81
A %*% B
## [,1] [,2] [,3]
## [1,] 30 66 102
## [2,] 36 81 126
## [3,] 42 96 150
固有値や逆行列は、R の関数で計算する。
式 | 意味 |
rowSums(x) | 行列 x の各行の総和 |
solSums(x) | 行列 x の各列の総和 |
rowMeans(x) | 行列 x の各行の平均 |
colMeans(x) | 行列 x の各列の平均 |
t(x) | 行列 x を転置 |
solve(x) | 行列 x の逆行列 |
diag(n) | n 行 n 列の単位行列 |
diag(a1:an) | 対角成分が (a1, a2, …, an) の対角行列 |
x[upper.tri(x)] <- n | 対角成分を除く上三角成分をすべて n に置換 |
x[lower.tri(x)] <- n | 対角成分を除く下三角成分をすべて n に置換 |
sum(x^n) | 行列 x の n 乗積 |
crossprod(x) | 行列 x のベクトル積 |
crossprod(x,y) | 行列 x と行列yの内積 |
eigen(x) | 行列 x の固有値と固有ベクトル |
det(x) | 行列 x の行列式 |
X <- diag(1:3)
X
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 2 0
## [3,] 0 0 3
## X[upper.tri(X)] <- 4
X
## [,1] [,2] [,3]
## [1,] 1 4 4
## [2,] 0 2 4
## [3,] 0 0 3
det(X)
## [1] 6
eigen(X)
## $values
## [1] 3 2 1
## $vectors
## [,1] [,2] [,3]
## [1,] 0.92450033 0.9701425 1
## [2,] 0.36980013 0.2425356 0
## [3,] 0.09245003 0.0000000 0
solve(X)
## [,1] [,2] [,3]
## [1,] 1 -2.0 1.3333333
## [2,] 0 0.5 -0.6666667
## [3,] 0 0.0 0.3333333
行列の結合
2 つの行列を、横方向で結合するとき(列の結合)は cbind
関数を使う。2 つの行列を、縦方向で結合するとき(行の結合)は rbind
関数を使う。
a <- matrix(1:9, 3, 3)
b <- matrix(11:19, 3, 3)
rbind(a, b)
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
## [4,] 11 14 17
## [5,] 12 15 18
## [6,] 13 16 19
cbind(a, b)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 4 7 11 14 17
## [2,] 2 5 8 12 15 18
## [3,] 3 6 9 13 16 19