[R] moving from loops to apply

Petr Savicky savicky at cs.cas.cz
Fri Jun 15 16:06:10 CEST 2012


On Fri, Jun 15, 2012 at 02:08:13PM +0200, Petr Savicky wrote:
> On Fri, Jun 15, 2012 at 11:27:44AM +0000, Schumacher, G. wrote:
> > Dear subscribers,
> > 
> > I have made a simulation using loops rather than apply, simply because the loop function seems more natural to me. However, the current simulation takes forever and I have decided - finally - to learn how to use apply, but - as many other people before me - I am having a hard time changing habits. My current problem is:
> > 
> > My current code for the loop is:
> > distances <- matrix(NA, 1000, 5)
> > distancer <- function(x, y){-(abs(x-y))}
> > x <- as.matrix(rnorm(1000, 5, 1.67))
> > y <- rnorm(5, 5, 1.67)
> > 
> > for (v in 1:1000){
> > distances[v,] <- distancer(x[v,], y)
> > }
> > 
> > The goal is to calculate the distances between the preferences of each voter (X) and all parties (Y). This gives a 1000 by 5 matrix (distances).
> > 
> > If I want to transform this to apply, what would be the best way to go? More specifically, I am not sure what to put into the X part of the apply function.
> 
[...]
> 
> Apply uses a loop internally, so it need not significantly improve efficiency.

Hi.

Let me include an example of the situation, when a vectorized code is
more efficient than a code using apply(), although the apply() code
is significantly simpler.

  n <- 10000

  x <- matrix(runif(3*n), nrow=n, ncol=3)

  t1 <- system.time( {
      y <- t(apply(x, 1, sort))
  } )

  # use a vectorized bubble sort, which is efficient on 3 elements
  t2 <- system.time( {
      x[, 1:2] <- cbind(pmin(x[, 1], x[, 2]), pmax(x[, 1], x[, 2]))
      x[, 2:3] <- cbind(pmin(x[, 2], x[, 3]), pmax(x[, 2], x[, 3]))
      x[, 1:2] <- cbind(pmin(x[, 1], x[, 2]), pmax(x[, 1], x[, 2]))
  } )

  print(identical(x, y))

  [1] TRUE
   
  print(rbind(t1, t2))

     user.self sys.self elapsed user.child sys.child
  t1     0.478        0   0.477          0         0
  t2     0.004        0   0.004          0         0

Hope this helps.

Petr Savicky.



More information about the R-help mailing list