[R] Another loop - deloop question

Charles C. Berry cberry at tajo.ucsd.edu
Sat Feb 3 02:04:22 CET 2007


Talbot,

Vectorization is not panacea.

For n == 100, m ==1000:

> system.time( for( i in 1:n ){ p[ g[[i]] ] <- p[ g[[i]] ] + y[[i]] })
[1]  0  0  0 NA NA
> system.time( p2 <- tapply( unlist(y), unlist(g), sum ))
[1] 0.16 0.00 0.16   NA   NA
> all.equal(p,as.vector(p2))
[1] TRUE
> system.time( p3 <- xtabs( unlist(y) ~ unlist(g) ) )
[1] 0.08 0.00 0.08   NA   NA
> all.equal(p,as.vector(p3))
[1] TRUE
> system.time( p4 <- unlist(y) %*% diag(m)[ unlist(g), ] )
[1] 4.16 0.20 4.36   NA   NA
> all.equal(p,as.vector(p4))
[1] TRUE


Vectorization has had no victory, Grasshopper.

---

For n == 10000, m == 10, the slowest method above becomes the fastest, and 
the fastest above becomes the slowest. So, you need to consider the 
applications to which you will apply this.

Read up on profiling if you really 'feel the need for speed'. (Writing R 
Extensions 3.2 Profiling R code for speed.)

Chuck

p.s. Please read "Writing R Extensions 3.1 Tidying R code" and follow the 
wisdom therein.


On Fri, 2 Feb 2007, Talbot Katz wrote:

> Hi.
>
> You folks are so clever, I thought perhaps you could help me make another
> procedure more efficient.
>
> Right now I have the following setup:
>
> p is a vector of length m
> g is a list of length n, g[[i]] is a vector whose elements are indices of p,
> i.e., integers between 1 and m inclusive); the g[[i]] cover the full set
> 1:m, but they don't have to constitute an exact partition, theycan overlap
> members.
> y is another list of length n, each y[[i]] is a vector of the same length as
> g[[i]].
>
> Now I build up the vector p as follows:
>
> p=rep(0,m)
> for(i in 1:n){p[g[[i]]]=p[g[[i]]]+y[[i]]}
>
> Can this loop be vectorized?
>
> Thanks!
>
> --  TMK  --
> 212-460-5430	home
> 917-656-5351	cell
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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.
>

Charles C. Berry                        (858) 534-2098
                                          Dept of Family/Preventive Medicine
E mailto:cberry at tajo.ucsd.edu	         UC San Diego
http://biostat.ucsd.edu/~cberry/         La Jolla, San Diego 92093-0901



More information about the R-help mailing list