假设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) < 1000
为TRUE
,则会打印出20。
但是,如果X
恰好是一个向量,因为只选择了一列,
当X可以是矩阵或向量时,如何检查数据点的数量?
我能想到的是
if(is.matrix(X)){
n <- nrow(X)
} else {
n <- length(X)}
if(n < 1000){print(a+b)}
任何人都有更好的主意吗?
谢谢
答案 0 :(得分:4)
您可以对这两种情况使用NROW
。来自?NROW
nrow
和ncol
会返回x
中的行数或列数。NCOL
和NROW
将矢量视为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]