データサイエンスのためのR速習 ~入門から機械学習まで~ 第2話

前回は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話は行列について駆け足で解説した。次回はその応用になるデータフレーム形式について見ていく。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA