[R] Please explain "do.call" in this context, or critique to "stack this list faster"
Hadley Wickham
hadley at rice.edu
Sun Sep 5 04:48:50 CEST 2010
> One common way around this is to pre-allocate memory and then to
> populate the object using a loop, but a somewhat easier solution here
> turns out to be ldply() in the plyr package. The following is the same
> idea as do.call(rbind, l), only faster:
>
>> system.time(u3 <- ldply(l, rbind))
> user system elapsed
> 6.07 0.01 6.09
I think all you want here is rbind.fill:
> system.time(a <- rbind.fill(l))
user system elapsed
1.426 0.044 1.471
> system.time(b <- do.call("rbind", l))
user system elapsed
98 60 162
> all.equal(a, b)
[1] TRUE
This is considerably faster than do.call + rbind because I spend a lot
of time working out how to do this most efficiently. You can see the
underlying code at http://github.com/hadley/plyr/blob/master/R/rbind.r
- it's relatively straightforward except for ensuring the output
columns are the same type as the input columns. This is a good
example where optimised R code is much faster than C code.
Hadley
--
Assistant Professor / Dobelman Family Junior Chair
Department of Statistics / Rice University
http://had.co.nz/
More information about the R-help
mailing list