矩阵和矢量形式的数据点数

时间:2014-10-22 02:34:12

标签: r matrix vector

假设X包含1000行m列,其中m等于3,如下所示:

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)}

任何人都有更好的主意吗?

谢谢

1 个答案:

答案 0 :(得分: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]