[R] moving from loops to apply
Petr Savicky
savicky at cs.cas.cz
Fri Jun 15 14:08:13 CEST 2012
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.
Hi.
There are also other ways to eliminate loops than apply-type functions.
Try, for example
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)
}
dst1 <- outer(c(x), y, FUN=distancer)
identical(distances, dst1)
[1] TRUE
xm <- matrix(x, nrow=nrow(x), ncol=length(y))
ym <- matrix(y, nrow=nrow(x), ncol=length(y), byrow=TRUE)
dst2 <- -abs(xm - ym)
identical(distances, dst2)
[1] TRUE
Apply uses a loop internally, so it need not significantly improve efficiency.
Petr Savicky.
More information about the R-help
mailing list