R言語マトリクス次元「消失」の問題

1109 ワード

マトリックス(matrix)はR言語における基礎的なデータ構造であり、R言語使用者がよく使用するデータ構造でもある.行列の次元は一般に2次元(m*n)である.
R言語におけるマトリクスの操作は非常に分かりやすいが,R言語に対してマトリクス操作を行う場合,特に注意が必要な点がある.次に例を挙げて説明します.
まず,テスト用のマトリクスを作成する.
test1  
 

次に,この行列を調べた.行列は3行2列の行列である.
> test1
     col1 col2
row1    1    4
row2    2    5
row3    3    6

次に,それらのサブマトリクスを任意に取り出しdim()関数を用いてサブマトリクスの次元を調べた.
> dim(test1[1:2, ]); test1[1:2, ]
[1] 2 2
     col1 col2
row1    1    4
row2    2    5
> dim(test1[2, ]); test1[2, ]
NULL
col1 col2
   2    5

ある次元が2*2のサブマトリクスを初めて取り出すと,システムはサブマトリクスの次元を正しく返し,2回目に1*2の次元のサブマトリクスを取り出すと,システムはサブマトリクスの次元を正しく返すことができず,次元がNULLであることを見出した.明らかに、R言語はこのサブマトリクスをベクトルとして処理したので、次元も「消えた」.これは非常に注意が必要で、筆者は日常的にR言語を使ってデータを分析する時、何気なくこの“罠”に落ちたことがあって、時にはコードの論理の上でいかなる間違いがないと感じて、しかしプログラムを実行する時、この1つの理解できないerrorが現れて、それから少しの時間をかけてゆっくりとデバッグして、それからはっと悟って、もとはこの原因です.
この問題を解決したり回避したりするのも簡単でdropパラメータを直接使用することができます.
> # using the drop parameter
> dim(test1[2, , drop = FALSE])
[1] 1 2

dropパラメータをFALSEに設定すると,R言語はマトリクスの次元を正しく返すことができる.