、それだけで次のようになります。
apply(ex_array[dimnames(ex_array)[[1]] == "10",,], 2:3, sum)
あなたがsapply
にあなたが適切な情報を2 x prod(N1, N2)
行列を取得する呼び出すことをラップした場合。私はあなたの例のデータセットの収縮したバージョンで働いていた:
ex_array <- array(1:360, dim = c(10, 6, 6),
dimnames = list(Col1 = c(rep(10,5), rep(20,5)),
Col2 = 1:6,
Col3 = 1:6))
str(sapply(unique(dimnames(ex_array)[[1]]), function(x) apply(ex_array[dimnames(ex_array)[[1]] == x,,], 2:3, sum)))
int [1:36, 1:2] 15 65 115 165 215 265 315 365 415 465 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "10" "20"
....それは列優先順でありますし、それを書き直すためにN1がN2配列をX X 2は、あなたがして、それを転置する必要がありますので、 「10」の値は一番上の行、「20」の値は二番目の行です。これらの値は、2 x N1 xN2配列にリキャストすることができます。私は、最初のスライスと確認
target <- array(t( # need to process the transpose
sapply(unique(dimnames(ex_array)[[1]]),
function(x) apply(ex_array[dimnames(ex_array)[[1]] == x,,], 2:3, sum))
),
dim= c(length(unique(dimnames(ex_array)[[1]])), dim(ex_array)[2:3]))
str(target)
# int [1:2, 1:6, 1:6] 15 40 65 90 115 140 165 190 215 240 ...
:あなたは「20」の値COORDを配置することにより、その後、座標適切なスライスに最初の配置「10」の値としてそれを考える、というように、というようにすることができます
target[1,,] == apply(ex_array[dimnames(ex_array)[[1]] == "10",,], 2:3, sum)
Col3
Col2 1 2 3 4 5 6
1 TRUE TRUE TRUE TRUE TRUE TRUE
2 TRUE TRUE TRUE TRUE TRUE TRUE
3 TRUE TRUE TRUE TRUE TRUE TRUE
4 TRUE TRUE TRUE TRUE TRUE TRUE
5 TRUE TRUE TRUE TRUE TRUE TRUE
6 TRUE TRUE TRUE TRUE TRUE TRUE
ために設計されていますので、私は、私はこれはおそらく見てするつもりだったことを自分自身に考えた私の陰謀を行っていたとして、それはここでは不格好です'reshape2'や' splitstackshape'や 'dplyr'関数を使うともっとコンパクトになります。 (そしてそれは私が正しい結果であると思うものを提供します。) –