jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

R言語で行列を結合する:rbindとcbind

R言語のちょっとした使い方のヒントです。今回は複数の行列(matrix)を結合するための関数rbindとcbindを紹介します。

rbindとcbind

rbindとcbindの違いは結合の方向です。rbindは縦につなげて、cbindは横につなげます。データ解析で行列オブジェクトを使用する際は、列に変数、行にケースを割り当てるのが典型的だと思います(図を参照)。f:id:jnobuyuki:20150206130307j:plain
図:行列オブジェクトで変数とケースを設定する

使用上の注意

rbindなら結合する行列の列数、cbindなら行数が合っていないとerrorが出ます。

#3種類の行列オブジェクトを用意
matA <- matrix(1:9,ncol = 3, nrow =3)
matB <- matrix(10:15,ncol = 2, nrow =3)
matC <- matrix(16:21,ncol = 3,nrow=2)

#rbind
rbind(matA,matB) #列の数が違うのでエラーが出ます。

rbind(matA,matC) #matAの下にmatCが結合されます。

#cbind
cbind(matA,matB) #matAの右側にmatBが結合されます。

cbind(matA,matC) #行の数が違うのでエラーが出ます。

繰り返し結合するときの最初の1回

複数のファイルの結果を分析した結果を1つの行列オブジェクトにまとめたいときにrbindやcbindは便利です。まとめ用の行列オブジェクトを用意しておき、各ファイルの分析が終わるごとに結果をまとめようのオブジェクトに結合させていきます。1つ注意したいのは、最初のファイルの分析結果をまとめ用のオブジェクトに結合する方法です。上で説明したように、rbindでは2つの行列の列の数が一致していないとエラーが出ます。でも、1回目の結果を分析した時点で、まとめ用の行列は空っぽです。変数オブジェクトの定義の自由度が極めて高いR言語ですが、さすがに定義していなかったものを結合には使えません。

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

matSum <- rbind(matSum, matA) #matSumが見つからないというエラーが出ます 

for文を使って繰り返し行列を結合するなら、1回目だけ例外処理を書いてもいいのですが、もっと簡単な方法があります。まとめ用のオブジェクトにNULLを入れておきます。rbindとcbindは結合するオブジェクトがNULLの場合エラーを出しません。これを利用すると1回目の例外処理を書かずに、複数の分析結果を次々に結合できます。

#まとめ用のオブジェクトをNULLで定義しておく
matSum <- NULL

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

matSum <- rbind(matSum, matA) #エラーを出しません