[R-br] Ajuda para evitar um loop com elegância 2
Benilton Carvalho
beniltoncarvalho em gmail.com
Quarta Abril 18 18:48:25 BRT 2012
Veja o codigo abaixo e encontre o que fazer nos 475 segundos que devem
sobrar... b
set.seed(1)
n <- 1e3
vetor1 <- rep(1:n, each = 5)
var1 <- abs(rnorm(n,3)) * vetor1
cond1 <- abs(rnorm(n,10)) * vetor1
fOriginal <- function(vetor1, var1, cond1){
var2 <- matrix(0, nrow=length(vetor1))
cond2 <- matrix(0, nrow=length(vetor1))
for(i in 1:(length(vetor1) - 1)){
if(vetor1[i] == vetor1[i+1]){
var2[i] = var1[i+1]
cond2[i] = cond1[i+1]
}else {
var2[i] = NA
cond2[i] = NA
}
}
var2[length(vetor1)] <- NA
cond2[length(vetor1)] <- NA
na.exclude(data.frame(var2, cond2))
}
fOtimizada <- function(vetor1, var1, cond1){
data.frame(var1[-1], cond1[-1])[diff(vetor1)==0,]
}
library(rbenchmark)
(res <- benchmark(original=fOriginal(vetor1, var1, cond1),
oneliner=fOtimizada(vetor1, var1, cond1),
columns=c('test', 'elapsed', 'relative')))
Mais detalhes sobre a lista de discussão R-br