要僅爲維度名稱的一個做到這一點,它可能只是:
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"
....但它在列優先的順序,並把它改寫爲2×N1 N2 X你數組,然後要轉,所以在「10」值是第一行,「20」值是第二行。然後這些值可以重新排列成一個2 x N1 xN2數組。你可以把它看作第一放置「10」在適當的切片座標值,然後通過將「20」的價值座標,等等,等等:
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 ...
然後我檢查了第一片與我在開頭得到的單名結果相同:
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'函數完成,它會更緊湊。 (並且它傳達了我認爲正確的結果。) –