[R] Componentwise means of a list of matrices?

Gabor Grothendieck ggrothendieck at gmail.com
Tue Dec 30 19:25:50 CET 2008


Or even:

abind(foo, along = 3)


On Tue, Dec 30, 2008 at 1:24 PM, Gabor Grothendieck
<ggrothendieck at gmail.com> wrote:
> Try:
>
> do.call(abind, c(foo, along = 3))
>
>
> On Tue, Dec 30, 2008 at 1:15 PM, baptiste auguie <ba208 at 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 <ba208 at 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 at 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.
>>
>



More information about the R-help mailing list