2014-10-22 50 views
2

假定X包含m列,其中m等於3如下1000行數:數據點的矩陣和向量形式

set.seed(5) 
X <- cbind(rnorm(1000,0,0.5), rnorm(1000,0,0.5), rnorm(1000,0,0.5)) 
進行

變量選擇,則該條件將之前檢查如下執行下一個操作。

if(nrow(X) < 1000){print(a+b)} 

,其中a是5和b是15,因此,如果是nrow(X) < 1000TRUE,然後20將被打印出來。 然而,在X是因爲只選擇了一個列是向量的情況下,

我怎樣才能檢查當X可以是一個矩陣或向量的數據點的數量?

我能想到的是,

if(is.matrix(X)){ 
    n <- nrow(X) 
    } else { 
    n <- length(X)} 
    if(n < 1000){print(a+b)} 

任何人有更好的主意嗎?

謝謝

+0

@RichardScriven - 你是對的。我會刪除我的評論。 – bsg 2014-10-22 02:42:21

回答

4

可以使用NROW兩種情況。從?NROW

nrowncol返回的行或列中存在的x數。 NCOLNROW做同樣處理的載體爲1列的矩陣。

因此,這意味着,即使子集被下降到一個載體中,只要x是一個數組,載體,或數據幀NROW將把它作爲一列矩陣。

sub1 <- X[,2:3] 
is.matrix(sub1) 
# [1] TRUE 
NROW(sub1) 
# [1] 1000 
sub2 <- X[,1] 
is.matrix(sub2) 
# [1] FALSE 
NROW(sub2) 
# [1] 1000 

所以if(NROW(X) < 1000L) a + b應該不管X是否是一個矩陣或矢量工作。我在下面使用<=,因爲X在您的示例中恰好有1000行。

a <- 5; b <- 15 
if(NROW(sub1) <= 1000L) a + b 
# [1] 20 
if(NROW(sub2) <= 1000L) a + b 
# [1] 20 

第二個選擇是使用drop=FALSE時,你的變量選擇。當子集只有一列時,這將使子集保持矩陣。這樣你就可以使用nrow而不用擔心。一個例子是

X[, 1, drop = FALSE]