R 选择矩阵列(对应行)作为Nx1(对应1xD)矩阵,与向量相反

R 选择矩阵列(对应行)作为Nx1(对应1xD)矩阵,与向量相反,r,R,设X为NbyD矩阵。通过d选择大小为n的子矩阵将返回这些维度的矩阵,除非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))。如果我们确定d=1,然后我们可以使用rbind(…)。但是,如果n和d

X
N
by
D
矩阵。通过
d
选择大小为
n
的子矩阵将返回这些维度的矩阵,除非
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)
)。如果我们确定
d=1
,然后我们可以使用
rbind(…)
。但是,如果
n
d
都可以是1,那么这两种方法都不起作用,因为我们可能会意外地将一行变成一列,反之亦然

据我所知,始终获得正确维度的矩阵的一种方法是调用
矩阵(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))

N如果您不想将矩阵子集简化为向量,请告诉
[
不要删除维度:

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

有关详细信息,请参见
?“[”

如果不想将矩阵子集简化为向量,请告诉
[
不要删除维度:

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

有关详细信息,请参见
?“[”

快速评论:将向量生成矩阵不会对性能造成太大的影响——您只需设置维度属性fyi:有一个
drop
参数设置为
[
。如果您将其设置为
FALSE
,那么您将得到所有
n
@martas:请将此标记为已回答。@我想,DWin完成了(我只需要将Ista的回答标记为已接受,对吗?)。一个简短的评论:把一个向量变成一个矩阵几乎没有性能损失——你只是在设置维度属性。仅供参考:有一个
drop
参数设置为
[
。如果你把它设置为
FALSE
,那么你将得到所有
n
@martas:请将这个标记为已回答。@DWin done,我想(我只需要将Ista的答案标记为已接受,对吗?)。