【问题标题】:The number of data points in matrix and vector forms矩阵和向量形式的数据点数
【发布时间】:2014-10-22 02:34:12
【问题描述】:

假设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) &lt; 1000TRUE,那么会打印出20。 但是,如果 X 恰好是一个向量,因为只选择了一列,

当 X 可以是矩阵或向量时,如何检查数据点的数量?

我能想到的是

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

谁有更好的主意?

谢谢

【问题讨论】:

  • @RichardScriven - 你是对的。我会删除我的评论。

标签: r matrix vector


【解决方案1】:

您可以在这两种情况下使用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

所以无论X 是矩阵还是向量,if(NROW(X) &lt; 1000L) a + b 都应该可以工作。我在下面使用&lt;=,因为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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多