|
行列 2019.06.15 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(责任编辑:) |
