[R] Effeciently sum 3d table

Greg Snow 538280 at gmail.com
Mon Apr 16 23:41:58 CEST 2012


Here is a simple example:

> mylist <- replicate(4, matrix(rnorm(12), ncol=3), simplify=FALSE)
> A <- Reduce( `+`, mylist )
> B <- mylist[[1]] + mylist[[2]] + mylist[[3]] + mylist[[4]]
> all.equal(A,B)
[1] TRUE

Basically what Reduce does is it first applies the function (`+` in
this case) to the 1st 2 elements of mylist, then applies it to that
result and the 3rd element, then that result and the 4th element (and
would continue on if mylist had more than 4 elements).  It is
basically a way to create functions like sum from functions like `+`
which only work on 2 objects at a time.

Another way to see what it is doing is to run something like:

> Reduce( function(a,b){ cat("I am adding",a,"and",b,"\n"); a+b }, 1:10 )

The Reduce function will probably not be any faster than a really well
written loop, but will probably be faster (both to write the command
and to run) than a poorly designed naive loop application.


On Mon, Apr 16, 2012 at 12:52 PM, David A Vavra <davavra at verizon.net> wrote:
> Thanks Greg,
>
> I think this may be what I'm after but the documentation for it isn't
> particularly clear. I hate it when someone documents a piece of code saying
> it works kinda like some other code (running elsewhere, of course) making
> the tacit assumption that everybody will immediately know what that means
> and implies.
>
> I'm sure I'll understand it once I know what it is trying to say. :) There's
> an item in the examples which may be exactly what I'm after.
>
> DAV
>
>
> -----Original Message-----
> From: Greg Snow [mailto:538280 at gmail.com]
> Sent: Monday, April 16, 2012 11:54 AM
> To: David A Vavra
> Cc: r-help at r-project.org
> Subject: Re: [R] Effeciently sum 3d table
>
> Look at the Reduce function.
>
> On Mon, Apr 16, 2012 at 8:28 AM, David A Vavra <davavra at verizon.net> wrote:
>> I have a large number of 3d tables that I wish to sum
>> Is there an efficient way to do this? Or perhaps a function I can call?
>>
>> I tried using do.call("sum",listoftables) but that returns a single value.
>>
>> So far, it seems only a loop will do the job.
>>
>>
>> TIA,
>> DAV
>
>
> --
> Gregory (Greg) L. Snow Ph.D.
> 538280 at gmail.com
>



-- 
Gregory (Greg) L. Snow Ph.D.
538280 at gmail.com



More information about the R-help mailing list