Dear listeRs, I'm finding that apply() behaves strangely when used on a 3-d array. For example: > at <- array(1:27,dim=c(3,3,3)) > at , , 1 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 , , 2 [,1] [,2] [,3] [1,] 10 13 16 [2,] 11 14 17 [3,] 12 15 18 , , 3 [,1] [,2] [,3] [1,] 19 22 25 [2,] 20 23 26 [3,] 21 24 27 > apply(at, 1, max) [1] 25 26 27 If, for the MARGIN argument in apply() 1 is rows, I would have expected as output a 3x3 matrix something like 7 16 25 8 17 16 9 18 27 Either that, or maybe the transpose of that, but a single vector seems rather random. Especially when you go > apply(at, 3, max) [1] 9 18 27 What is that the max of? Each submatrix? The diagonal? I'm confused. Can anyone clarify this? Besides this, is there a function that will work on a 3d array, the way I'm implying, or do I need to write an explicit loop that takes 2d slices of my 3d array? Thanks! Toby
Gabor Grothendieck
2006-Sep-20 19:51 UTC
[R] Unexpected behavior of apply() over a 3d array
Read ?apply carefullly. If FUN returns as a scalar as it does here then the result dimensions are dim(X)[MARGIN]. For example, apply(X, 1, max) has three components which are max(X[1,,]), max(X[2,,]) and max(X[3,,]) and apply(X, 3, max) has three components which are max(X[,,1]), max(X[,,2]) and max(X[,,3]) Also try apply(X, 1:2, max), etc. On 9/20/06, Toby Muhlhofer <toby.m at mail.utexas.edu> wrote:> Dear listeRs, > > I'm finding that apply() behaves strangely when used on a 3-d array. For > example: > > > at <- array(1:27,dim=c(3,3,3)) > > at > , , 1 > > [,1] [,2] [,3] > [1,] 1 4 7 > [2,] 2 5 8 > [3,] 3 6 9 > > , , 2 > > [,1] [,2] [,3] > [1,] 10 13 16 > [2,] 11 14 17 > [3,] 12 15 18 > > , , 3 > > [,1] [,2] [,3] > [1,] 19 22 25 > [2,] 20 23 26 > [3,] 21 24 27 > > > apply(at, 1, max) > [1] 25 26 27 > > If, for the MARGIN argument in apply() 1 is rows, I would have expected > as output a 3x3 matrix something like > > 7 16 25 > 8 17 16 > 9 18 27 > > Either that, or maybe the transpose of that, but a single vector seems > rather random. Especially when you go > > > apply(at, 3, max) > [1] 9 18 27 > > What is that the max of? Each submatrix? The diagonal? I'm confused. Can > anyone clarify this? > > Besides this, is there a function that will work on a 3d array, the way > I'm implying, or do I need to write an explicit loop that takes 2d > slices of my 3d array? > > Thanks! > > Toby > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
It's definitely not random! Try apply(at,3,I) to see what the marginal table is that max operates on, and you'll see where your result comes from. On 20/09/06, Toby Muhlhofer <toby.m at mail.utexas.edu> wrote:> Dear listeRs, > > I'm finding that apply() behaves strangely when used on a 3-d array. For > example: > > > at <- array(1:27,dim=c(3,3,3)) > > at > , , 1 > > [,1] [,2] [,3] > [1,] 1 4 7 > [2,] 2 5 8 > [3,] 3 6 9 > > , , 2 > > [,1] [,2] [,3] > [1,] 10 13 16 > [2,] 11 14 17 > [3,] 12 15 18 > > , , 3 > > [,1] [,2] [,3] > [1,] 19 22 25 > [2,] 20 23 26 > [3,] 21 24 27 > > > apply(at, 1, max) > [1] 25 26 27 > > If, for the MARGIN argument in apply() 1 is rows, I would have expected > as output a 3x3 matrix something like > > 7 16 25 > 8 17 16 > 9 18 27 > > Either that, or maybe the transpose of that, but a single vector seems > rather random. Especially when you go > > > apply(at, 3, max) > [1] 9 18 27 > > What is that the max of? Each submatrix? The diagonal? I'm confused. Can > anyone clarify this? > > Besides this, is there a function that will work on a 3d array, the way > I'm implying, or do I need to write an explicit loop that takes 2d > slices of my 3d array? > > Thanks! > > Toby > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- ================================David Barron Said Business School University of Oxford Park End Street Oxford OX1 1HP