仅对其中一个维度名称执行此操作,可以是:
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 x N1 x N2 数组,然后您需要转置它,因此“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