2

R でのデータ操作に関する非常に一般的な質問があり、便利で迅速な方法を探しています。次元 (R) 行 (nxm) の行列、つまり R 行と n × m 列の行列があるとします。

set.seed(999)
n = 5; m = 10; R = 100
ncol = m*n
mat = matrix(rnorm(n*m*R), nrow=R, ncol=ncol)

new.matここで、次元 (R) 行 (m)の新しい行列 ( と呼びます) が必要です。つまり、 の特定の行が与えられた場合、最初の要素matの数値 (合計など) を計算し、次に次の数値を計算します。n次のn要素など。このように、 の最初の行は数字でmat終わりmます。の 1 行おきに同じことが行われmatます。

上記の例では、新しい行列の 1 行目の 1番目の要素new.matは、 sum(mat[1,1:5])2 番目の要素はsum(mat[1,6:10])、最後の要素は になりsum(mat[1,46:50])ます。の 2 行目はnew.matです(sum(mat[2,1:5]), sum(mat[2,6:10),...)

可能であれば、forループを回避することをお勧めします。ありがとうございました!

4

1 に答える 1

4

rowsumここで便利な機能です。t必要なものを取得するには、少し身代金を支払う必要があります

次のようなグループ化ベクトルを作成する必要がありますc(1,1,1,1,1,2,2,2,2,2,....,10,10,10,10,10)

grp <- rep(seq_len(ceiling(ncol(mat)/5)), each = 5, length.out = ncol(mat))
# this will also work, but may be less clear why.
# grp <- (seq_len(ncol(mat))-1) %/%5   

rowsumグループ化変数の各レベルについて、数値行列のようなオブジェクトの行全体の列の合計を計算します

列全体の行の合計を探しているので、結果 (および入力) を転置する必要があります。

 t(rowsum(t(mat),grp))
于 2013-03-14T05:37:46.003 に答える