[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