让X
成为N
个D
矩阵。从n
选择大小为d
的子矩阵会返回这些维度的矩阵,除非 n
和d
中的至少一个等于1,其中我们得到一个向量的情况。有趣的是,即使n
和d
中的一个为0,另一个不 1,R仍会返回正确尺寸的矩阵。
现在,如果我们确定n!=1
,则执行cbind(X[row.subset,col.subset])
将返回正确维度的矩阵,无论是d==1
还是n=length(row.subset)
和d=length(col.subset)
{ {1}})。如果我们确定d!=1
,那么我们可以使用rbind(...)
。但是,如果n
和d
都可以为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))
提前致谢。
答案 0 :(得分:5)
如果您不想简化矩阵子集到向量,只需告诉[
不要丢弃维度:
> dim(X[1:2,1, drop=FALSE])
[1] 2 1
> dim(X[1,1:2, drop=FALSE])
[1] 1 2
有关详细信息,请参阅?"["
。