1

by行列Xとしましょう。サイズが byの部分行列を選択すると、これらの次元の行列が返されます。ただし、少なくとも 1と1 が 1 に等しい場合は、代わりにベクトルが取得されます。興味深いことに、 R は、との一方が 0 で、もう一方が 1 でない場合でも、正しい次元の行列を返します。NDndndnd

ここで、 が確実である場合、(ここではと) かどうかに関係なくn!=1、実行するcbind(X[row.subset,col.subset])と正しい次元の行列が返されます。であると確信できる場合は、 を使用できます。しかし、との両方が 1 になる可能性がある場合、誤って行を列に変換したり、その逆を行ったりする可能性があるため、どちらのアプローチも機能しません。d==1n=length(row.subset)d=length(col.subset)d!=1rbind(...)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))

前もって感謝します。

4

1 に答える 1

5

行列サブセットをベクトルに単純化したくない場合は、[次元を落とさないように指示してください:

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

詳細?"["については、を参照してください。

于 2013-03-17T03:11:59.300 に答える