[R-br] Ajuda para evitar um loop com elegância 2

Gustavo Marcatti vgp.gustavo em yahoo.com.br
Segunda Abril 23 17:45:13 BRT 2012


Muito Bom!!! Impressionante a diferença (no tempo e no tamanho da função)!
Valeu

Gustavo


________________________________
 De: Benilton Carvalho <beniltoncarvalho em gmail.com>
Para: r-br em listas.c3sl.ufpr.br; Gustavo Marcatti <vgp.gustavo em yahoo.com.br> 
Enviadas: Quarta-feira, 18 de Abril de 2012 18:48
Assunto: Re: [R-br] Ajuda para evitar um loop com elegância 2
 
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')))
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20120423/4732e04f/attachment.html>


Mais detalhes sobre a lista de discussão R-br