[R-es] Codigo Ineficiente

Carlos J. Gil Bellosta cgb en datanalytics.com
Mie Ene 30 23:39:07 CET 2013


Hola, ¿qué tal?

Creo que te bastaría con algo así:

n<-nrow(alertas_monitoreo)

for(i in 1:n) {
  alertas_monitoreo$alertas_demora[i] <- i -
sum(alertas_monitoreo$segundos < alertas_monitoreo$segundos_hta[i] -
alertas_monitoreo$demora[i] ) )
  print(paste("faltan ", n-i,sep=" "))
}

Resto a i (las abiertas hasta la fecha) las abiertas antes de hta - demora.

Menos código, menos tiempo.

Y aún admite mejoras:

1) Precalcular (vectorialmente) alertas_monitoreo$segundos_hta[i] -
alertas_monitoreo$demora[i]  (llamémoslo v)
2) Tal vez usar cut (?cut) con los cortes dados por v y luego cumsum
(suma acumulada)
3) ...

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com


El día 30 de enero de 2013 14:02, Pablo Andres Guzzi
<guzzipa en gmail.com> escribió:
> Hola, como estan?
>
> Tengo que hacer una variable y la unica forma que encontre de hacerlo es
> con un bucle, lo cual hace que tarde muchisimo.
>
> Para contextualizarlos, tengo una base de alertas(generadas por
> determinadas reglas). Yo hice un campo/variable que indica cuanto tiempo
> estuvo (una persona que monitorea estas alertas) sin mirar alertas. Este
> campo de llama demora. Ademas tengo un campo que tiene el tiempo en el que
> la alerta se vio, segundos_hta
>
> Mi data frame se llama alertas_monitoreo. Las variables influyentes son:
> segundos: tiene el tiempo en segundos dia*24*60*60+hora*60*60+min*60+seg.
> Este tiempo indica el alta de la alerta, es decir cuando se genero la
> alerta.
> segundos_hta: tiene el tiempo en segundos
> dia*24*60*60+hora*60*60+min*60+seg. Este tiempo indica cuando se miro la
> alerta, es decir, cuando el muchacho de monitoreo tomo una accion sobre
> esta alerta.
> demora: tiene el tiempo en segundo que paso entre la accion de la alerta
> anterior y la actual.
> alerta: todos unos (1).
>
> Finalmente, la variable que genero es, alertas_demora, que tiene las
> alertas que se generaron entre el intervalo de tiempo en el que la persona
> de monitoreo estuvo inactiva.
>
>
> n<-nrow(alertas_monitoreo)
>
> for(i in 1:n) {
> #me quedo con el tiempo en el que la alerta fue revisada
>   t.i <- alertas_monitoreo$segundos_hta[i]
> #creo un objeto que contenga el tiempo entre la alerta anterior a esta y
> esta, campo demora.
>   intervalo<-alertas_monitoreo$demora[i]
>   t.ini <- t.i-intervalo   #creo el intervalo de tiempo
>   t.fin <- t.i
>
> #me quedo con las alertas entre generadas
>   temp<-subset(alertas_monitoreo, segundos >= t.ini & segundos <= t.fin)
>   alertas<-sum(temp$alerta)
>   alertas_monitoreo$alertas_demora[i]<-alertas
>   print(paste("faltan ", n-i,sep=" "))
> }
>
>
>
>
> Abrazo
>
> Pablo A. Guzzi
> guzzipa en gmail.com
>
>         [[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es



Más información sobre la lista de distribución R-help-es