[R] Componentwise means of a list of matrices?
baptiste auguie
ba208 at exeter.ac.uk
Tue Dec 30 20:36:16 CET 2008
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
> <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.
>>>
>>
_____________________________
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
More information about the R-help
mailing list