前回はRの数値計算とベクトルについて勉強した。
[getpost id=”427″ target=”_blank”]
ベクトルはデータを1次元で保存するものだったのに対し、今回見ていく行列 (matrix) はデータを2次元で格納する。ベクトルと同じく、行列も保存できるのは同じデータタイプに限られる (違うタイプのものを格納するリスト形式は、第4話で紹介する)。
この記事の内容
行列
行列の定義
行列はmatrix()関数にベクトルを渡すことで作成できる。行の数はnrow引数で指定する。
v <- 1:6 matrix (v) matrix (v, nrow=2)
埋めていく順番はbyrow引数にTRUEを渡すことで変更できる。
matrix (v, nrow=2, byrow=TRUE)
ベクトル同士を結合し、それをmatrix関数に渡せば行列ができる。例えばGoogleとAppleの仮想的な株価をベクトルにそれぞれ格納し、それらを合わせてstocksというベクトルを作る。そのベクトルは1次元だが、これを2次元の行列にしてみる。
goog <- c(150,160,170,180,190) apple <- c(200,190,180,170,160) stocks <- c(google, apple) stocks.matrix <- matrix (stocks, byrow=TRUE, nrow=2)
行列になっているかはis.matrix ()関数で確認できる。行列ならTRUEとなる
is.matrix (stocks.matrix)
行と列に名前をつける
行列に名前をつけるには、ベクトルのnames ()関数の行列版であるcolnames () 関数とrownames ()関数に名前をベクトル形式で指定する。rownames () を使うと、行 (row) に名前をつけることができる。
company.names <- c('Google', 'Apple') rownames (stocks.matrix) <- company.names stocks.matrix
同様に、列 (column) に名前をつけるにはcolnames () 関数を使う。
days <- c('Mon', 'Tue', 'Wed', 'Thu', 'Fri') colnames (stocks.matrix) <- days stocks.matrix
行列の計算
行列と数の四則演算
行列と数の四則演算は、行列のそれぞれの要素に数が作用する。例えば行列 + 1は、行列の全ての要素に1を加えることになる。
mat <- matrix (1:50, byrow=TRUE, nrow=5) 4*mat # 全要素を4倍 1/mat mat^2 # 全要素を2乗 mat >12 # 全要素について12との代償を調べる (12より大きいとTRUEになる)
行列同士の四則演算
行列同士の演算は要素ごとになる。
mat + mat mat^mat mat2 <- matrix (1:9, nrow=3) mat2*mat2
内積の計算なら*の両脇を%で囲み%*%とする。
mat2 %*% mat2
行/列の合計や平均
列ごとの合計はcolSums ()関数、列ごとの合計はrowSums () 関数で取得可能。
colSums(stocks.matrix) rowSums (stocks.matrix)
平均はcolMeans () 関数やrowMeans ()関数で。
colMeans (stocks.matrix) rowMeans (stocks.matrix)
行列の操作
行列の結合
行列を行 (row) 方向, つまり縦方向につなげるにはrbind ()関数、列 (column) 方向、つまり横方向につなげるにはcbind () 関数を使う。
FB <- c (80,85,90,95,100) tech.stocks <- rbind (stocks.matrix, FB) # 列方向につなげた tech.stocks avg <- rowMeans (tech.stocks) # 行方向ごと、つまり会社ごとに平均をとる avg tech.stocks <- cbind (tech.stocks, avg) # 列方向に結合 tech.stocks
行列の選択
行の選択、列の選択は[行番号, 列番号] とする。指定しないと全ての意味になる。
mat[1,] # 1行目, 全ての列 mat[,1] # 全ての行, 1列列
連続した範囲を意味する:記号も使うことができる
mat[1:3,] # 1から3行目, 全ての列 mat[1:2, 1:3] # 1から2行目, 1から3列目 mat[c(1,3), c(5,9,10)] # 1と3行目, 5と9と10列目
第3話について
というわけで第2話は行列について駆け足で解説した。次回はその応用になるデータフレーム形式について見ていく。