select矩阵列(列)行)作为Nx1 (resp.1xD)矩阵,而不是向量



XN × D矩阵。通过d选择大小为n的子矩阵,返回一个维度为的矩阵,除非至少有一个nd等于1,在这种情况下我们得到一个向量。有趣的是,即使nd中的一个为0,而另一个不是 1, R仍然返回正确维数的矩阵。

现在,如果我们确定n!=1,那么执行cbind(X[row.subset,col.subset])将返回一个正确维度的矩阵,而不管d==1是否正确(这里是n=length(row.subset)d=length(col.subset))。如果我们确定d!=1,那么我们可以使用rbind(...)。但是,如果nd都可以为1,那么这两种方法都不起作用,因为我们可能会意外地将行变成列,反之亦然。

据我所知,总是得到正确维度的矩阵的一种方法是调用matrix(X[row.subset,col.subset],nrow=n,ncol=d)。然而,我不觉得这应该是正确的方法,而且我也不相信没有性能损失。有没有更"原生"的解决方案?

下面是一个工作示例:

N <- 6
D <- 3
X <- matrix(rnorm(N*D),ncol=D)
dim(X[1:2,1:2]) #returns 2 2
dim(X[1:2,1]) #returns NULL, this is a vector
dim(cbind(X[1:2,1])) #returns 2 1
dim(cbind(X[1,1:2])) #returns 2 1, but we'd like it to be 1 2
dim(rbind(X[1,1:2])) #returns 1 2
dim(rbind(X[1:2,1])) #returns 1 2, but we'd like it to be 2 1
row.subset <- 1:4
col.subset <- 2
#I _think_ this is always correct, but it's verbose:
matrix(X[row.subset,col.subset],nrow=length(row.subset),ncol=length(col.subset))

如果您不想将矩阵子集简化为向量,只需告诉[不要降低维度:

> dim(X[1:2,1, drop=FALSE])
[1] 2 1
> dim(X[1,1:2, drop=FALSE])
[1] 1 2

详情见?"["

最新更新