19. 行列の作成


行列の作成

R では以下の手順で行列を作成する.

  1. 行列の要素をベクトル(配列やリスト,行列でも可)で用意する
  2. 関数 matrix(ベクトル, 行数, 列数) でベクトルから行列に変換する

例として,ベクトル (1,2,3,4,5,6) を変換して,行列   を作成する.

 
 matrix(1:6, nrow=2, ncol=3)           # nrow で行数,ncol で列数を指定する
                                       # matrix(1:6, 2, 3) と略記しても良い
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

R での行列とは行と列を持つ 2 次元配列を指す.数学の世界の行列は各要素が数値となっている行列しか扱わないだろうが,R の行列は 2 次元配列なので論理値や文字列などを要素とする行列を作成することも出来る.よって,配列を生成しているという意味で関数 array() を用いても作成することが出来る.

行列を作成する場合,指定された要素は左の列から順に (上から下へ) 埋められる.要素を上の行から順に (左から右へ) 埋める場合は,引数 byrow=T を指定する.

 
 matrix(1:6, nrow=2, ncol=3, byrow=T)  # matrix(1:6, 2, 3, byrow=T)でも可

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

行列要素へのアクセス

行列の中の数を「要素」と呼び,行は左から順に 1, 2, … と,列は上から順に 1, 2, … と番号が振られている.以下では行列 x について要素にアクセスする方法を一覧表で示している.

基本は,[ と ] の間にカンマで区切って行の位置(番号)と列の位置(番号)を指定ればよい.

 
 ( x <- matrix(1:6, nrow=2, ncol=3) )

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

 x[1, 2]

[1] 3

 x[-1, c(T,F,T)]                       # 1 行目を非表示,2 行目 1,3 成分を指定

[1] 2 6

x[k] で指定する場合は,要素はまず 1 列目の上から順に 1, 2, … 次に 2 列目の上から順に … と番号が振られることになる.

以下に指定例の一覧を示す.

コマンド

機能

x[2, ]

2 行目を取り出す

x[ ,2]

2 列目を取り出す

x[1, 2]

1 行 2 列目の成分を取り出す

x[c(1,2), 2]

1,2 行 2 列目の成分を取り出す

x[c(1,2), c(1,3)]

1, 2 行目と 1, 3 列を取り出す

x[ ,-c(1, 3)]

1, 3列を除外した行列を取り出す

x[ , c(T,F,T)]

1, 3列を取り出す

rowSums()

行の総和

colSums()

列の総和

rowMeans()

行の平均

colMeans()

列の平均

[ と ] の間にベクトルや行列を指定して行列の一部分を取り出すことも出来る.

 
 x[matrix(c(1,2,2,3), 2, 2)]            # 行列で指定
                                        # x[cbind(c(1,2), c(3,4))] でも可
[1] 3 6

 x[1:4]                                 # 行列がベクトルに変換されてから最初の 4 個の要素が取り出される

[1] 1 2 3 4

要素を取り出す際,引数に drop=FALSE を指定することで,行列の要素抽出における結果のベクトル化を防ぐことも出来る(結果が複数行で無い場合にベクトル化がなされる).

 
 x[ ,2, drop=F]                         # 2 列目を行列の形で取り出す

     [,1]
[1,]    3
[2,]    4

行列の結合

ベクトルや行列を結合することで新たな行列を作ることも出来る.行ベクトル単位で結合する場合は関数 rbind() を,列ベクトル単位で結合する場合は関数 cbind() を使う.

 
 ( x <- rbind(c(1,2,3), c(4,5,6)) )     # 行ベクトルを与えて行列生成

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

 ( x <- cbind(c(1,2,3),c(4,5,6))  )     # 列ベクトルを与えて行列生成

     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

3 つ以上のベクトルや行列を一度に結合することも出来る.

 
 ( x <- rbind(1:3, c(4, 5, 6), 7:9) )   # 3 個の行ベクトルを結合

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

 ( y <- cbind(1:3, c(4, 5, 6), 7:9) )   # 3 個の列ベクトルを結合

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9