2011-09-29 7 views
3

Rほぼ毎日何度も何度も私をサプライズ:1×m行列の次元?

m <- matrix(1:6, ncol=2) 
while(dim(m)[1] > 0){ 
    print(m); 
    m <- m[-1,] 
} 

が与える:

 [,1] [,2] 
[1,] 1 4 
[2,] 2 5 
[3,] 3 6 
    [,1] [,2] 
[1,] 2 5 
[2,] 3 6 
Error in while (dim(m)[1] > 0) { : argument is of length zero 

は、Rは、1xNの行列に問題があるんや場所私のミスはありますか?

> nrow(m[-c(2,3), ]) 
NULL 
> dim(m[-c(2,3), ]) 
NULL 
> m[-c(2,3), ][,1] 
Error in m[-c(2, 3), ][, 1] : incorrect number of dimensions 
> str(m[-c(2,3), ]) 
int [1:2] 1 4 

私の実際の問題に近い初期の例を簡単に修正する方法はありますか? BTW:このループは私のアルゴリズムのボトルネックです。したがって、効率的なソリューションが評価されます。

多くの感謝!

+3

[Rインフェルノ](HTTP参照://www.burns-statを.com/pages/Tutor/R_inferno.pdf)は、この種の「驚き」の素晴らしいガイドです。これはセクション8.1.44にあります。 – Aaron

+0

も参照してください:http://stackoverflow.com/q/7352254/210673 – Aaron

答えて

8

[のサブセットのデフォルトの動作は、該当する場合、より簡単な構造に変換することです。つまり、1xn行列にサブセット化すると、オブジェクトはベクトルに変換されます。

[drop=FALSE引数を使用して、この動作を変更するにはより多くの情報について

m <- matrix(1:6, ncol=2) 
while(dim(m)[1] > 0){ 
    print(m); 
    m <- m[-1, , drop=FALSE] 
} 

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

?"["

+0

私は、ドキュメントでdrop = FALSE引数を見つけようと時間を費やすべきではないことを知っていました。 – richiemorrisroe