# [R] How to apply vector value function to a multidimensional array indexed by the remaining dimensions?

Henrik Bengtsson hb at stat.berkeley.edu
Sat Oct 2 17:43:31 CEST 2010

```apply() is your friend. You can specify more than one dimension in
argument 'MARGIN'.  Example:

> x <- array(1:100,c(3,4,5))

> y <- apply(x, MARGIN=c(2,3), FUN=sum)
> y
[,1] [,2] [,3] [,4] [,5]
[1,]    6   42   78  114  150
[2,]   15   51   87  123  159
[3,]   24   60   96  132  168
[4,]   33   69  105  141  177

> z <- matrix(0, nrow=4, ncol=5);
> for (ii in 1:3) z <- z + x[ii,,];
> z
[,1] [,2] [,3] [,4] [,5]
[1,]    6   42   78  114  150
[2,]   15   51   87  123  159
[3,]   24   60   96  132  168
[4,]   33   69  105  141  177
> stopifnot(all.equal(z,y))

/Henrik

On Fri, Oct 1, 2010 at 12:38 PM, yunjiangster <yunjiangster at gmail.com> wrote:
>
> Hi,
>  I am looking for some generalization of colSums and rowSums for general
> vector valued functions, and for arrays of more than 2 dimensions.
>  So as a concrete example, suppose I have a 3 dimensional array, given by x
> = array(1:100,c(3,4,5)).
> and I want to sum the 3rd index of x to obain a 3 by 4 matrix. Using rowSums
> would return a vector of length 3 because it treats the last two indices as
> a single index.
>
>  Besides summation, let's say if I define a vector valued function
> f<-function(x){min(x[1],min(x[2],x[3]))}, and I want to apply f to the last
> index of x, meaning for each 1<= i <= 3, 1<=j <=4, I want to compute
> f(x[i,j,]), and then put them in a 3 by 4 matrix. How would I be able to do
> that without using a for loop?
>
>  thanks.
>
>  Sincerely,
>  John
> --
> View this message in context: http://r.789695.n4.nabble.com/How-to-apply-vector-value-function-to-a-multidimensional-array-indexed-by-the-remaining-dimensions-tp2937368p2937368.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help