Consider the array a
:
> a <- array(c(1:9, 1:9), c(3,3,2))
> a
, , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
How do we efficiently compute the row sums of the matrices indexed by the third dimension, such that the result is:
[,1] [,2]
[1,] 12 12
[2,] 15 15
[3,] 18 18
??
The column sums are easy via the 'dims'
argument of colSums()
:
> colSums(a, dims = 1)
but I cannot find a way to use rowSums()
on the array to achieve the desired result, as it has a different interpretation of 'dims'
to that of colSums()
.
It is simple to compute the desired row sums using:
> apply(a, 3, rowSums)
[,1] [,2]
[1,] 12 12
[2,] 15 15
[3,] 18 18
but that is just hiding the loop. Are there other efficient, truly vectorised, ways of computing the required row sums?
@Fojtasek's answer mentioned splitting up the array reminded me of the
aperm()
function which allows one to permute the dimensions of an array. AscolSums()
works, we can swap the first two dimensions usingaperm()
and runcolSums()
on the output.Some comparison timings of this and the other suggested R-based answers:
So on my system the
aperm()
solution appears marginally faster:However,
rowSums3d()
doesn't give the same answers as the other solutions: