2011-09-29 78 views
3

[R連連suprises我幾乎每天都:1 x 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 

任何想法如何輕鬆修復最初的例子,這接近我的實際問題?順便說一句:這個循環是我算法的瓶頸。因此,有效的解決方案是讚賞。

非常感謝!

+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