Thanks, in fact it's quite clean this way. I've added this tip to the R-wiki,

http://wiki.r-project.org/rwiki/doku.php?id=guides:overview-data-manip


baptiste


On 30 Dec 2008, at 19:25, Gabor Grothendieck wrote:

Or even:

abind(foo, along = 3)




On Tue, Dec 30, 2008 at 1:24 PM, Gabor Grothendieck
<ggrothendi...@gmail.com> wrote:
Try:

do.call(abind, c(foo, along = 3))


On Tue, Dec 30, 2008 at 1:15 PM, baptiste auguie <ba...@exeter.ac.uk> wrote:
In fact, when writing my post I tried to do exactly what you did in creating a 3d array from the list, and I failed miserably! This is (imho) partly because the syntax is not very clean or straightforward as compared to the apply and *ply family. A list of matrices with equal dimensions is easily produced by mapply(... , simplify=F), or lapply, while an array needs to be created in a more verbose manner (as far as i know, some version of a loop).

I just remembered the abind package which makes this a bit easier, although the default is not quite as convenient for this purpose as I'd initially
hoped:

foo <- list(rbind(c(1,2,3),c(4,5,6)),rbind(c(7,8,9),c(10,11,12)))
foo2 <- unlist(foo)
dim(foo2) <- c(dim(foo[[1]]), length(foo))

library(abind)
foo3 <-  do.call(function(...) abind(..., along=3), foo)
foo2==foo3

Best wishes,

baptiste


On 30 Dec 2008, at 18:53, hadley wickham wrote:

On Tue, Dec 30, 2008 at 10:21 AM, baptiste auguie <ba...@exeter.ac.uk >
wrote:

I thought this was a good candidate for the plyr package, but it seems
that
l*ply functions are meant to operate only on separate list elements:

Lists are the simplest type of input to deal with because they are
already
naturally
divided into pieces: the elements of the list. For this reason, the l*ply
functions don't
need an argument that describes how to break up the data structure.

(from: plyr: divide and conquer, Hadley Wickham 2008)

Perhaps a new case to consider?

Possibly, but here I would argue that the choice of data structure
isn't quite right - if the matrices all have the same dimension, then
they should be stored in an array, not a list:

foo <- list(rbind(c(1,2,3),c(4,5,6)),rbind(c(7,8,9),c(10,11,12)))
foo2 <- unlist(foo)
dim(foo2) <- c(dim(foo[[1]]), length(foo))

Then you can use apply (or aaply) directly on that matrix:

apply(foo2, c(1,2), mean)
apply(foo2, c(1,2), mean, trim = 0.1)

etc.

Hadley

--
http://had.co.nz/

_____________________________

Baptiste AuguiƩ

School of Physics
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag

______________________________________________
R-help@r-project.org 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.



_____________________________

Baptiste AuguiƩ

School of Physics
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag

______________________________________________
R-help@r-project.org 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.

Reply via email to