On Apr 16, 2012, at 5:41 PM, Greg Snow wrote:
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.
It's faster on my machine (but only fractionally) but it has the as
yet unremarked-upon advantage that it will preserve attributes of the
tables such as dimnames.
> system.time(ans1 <- array(do.call(mapply,c(sum,z)),dim=2:4))
user system elapsed
0.841 0.007 0.851
> system.time(ans2 <-array(rowSums(do.call(cbind,z)),dim=2:4))
user system elapsed
0.132 0.003 0.145
And on my system .... the Reduce strategy wins by a hair:
> system.time(ans3 <- Reduce("+", z) )
user system elapsed
0.129 0.001 0.134
--
(the other) David.
On Mon, Apr 16, 2012 at 12:52 PM, David A Vavra
<dava...@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:538...@gmail.com]
Sent: Monday, April 16, 2012 11:54 AM
To: David A Vavra
Cc: r-help@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
<dava...@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.
538...@gmail.com
--
Gregory (Greg) L. Snow Ph.D.
538...@gmail.com
______________________________________________
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.
David Winsemius, MD
West Hartford, CT
______________________________________________
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.