Экстраполирование от @G.В ответе Гротендика, эта функция использует aperm
для вычисления кумулятивной суммы по любому полю n-мерного массива:
array_cumsum <- function(a, margin) {
n <- length(dim(a))
permorder <- append(x = 2:n, 1, margin - 1)
aperm(apply(a, -margin, cumsum), permorder)
}
Например, используя простой массив, полный единиц, для удобства просмотра суммируемых сумм,функция может быть использована для расчета наценки по 2-му измерению:
a <- array(1, dim = c(2,3,4))
array_cumsum(a3, 2)
# , , 1
#
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 1 2 3
#
# , , 2
#
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 1 2 3
#
# , , 3
#
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 1 2 3
#
# , , 4
#
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 1 2 3
, а также по 3-му измерению:
array_cumsum(a3, 3)
# , , 1
#
# [,1] [,2] [,3]
# [1,] 1 1 1
# [2,] 1 1 1
#
# , , 2
#
# [,1] [,2] [,3]
# [1,] 2 2 2
# [2,] 2 2 2
#
# , , 3
#
# [,1] [,2] [,3]
# [1,] 3 3 3
# [2,] 3 3 3
#
# , , 4
#
# [,1] [,2] [,3]
# [1,] 4 4 4
# [2,] 4 4 4