[R-es] Optimizar código

Gabriela Cendoya gcendoya en balcarce.inta.gov.ar
Lun Nov 2 14:23:10 CET 2009


Hola Luciano:
no se es la más elegante de las soluciones pero es bastante más rápida que 
los loops,

names(test) <- 1:length(test)
test0 <- test[test==0]
filas <- as.numeric(names(test0))

names(test0)[c(names(test0)[1]>600,diff(filas)>600)]

esta última sentencia te da los nombres de las filas donde antes hubo más de 
600 unos seguidos

Saludos Gabriela
----- Original Message ----- 
From: "Luciano Selzer" <luciano.selzer en gmail.com>
To: <r-help-es en r-project.org>
Sent: Monday, November 02, 2009 9:53 AM
Subject: [R-es] Optimizar código


Hola lista, tengo una base de datos muy grande de un datalogger.
Consiste en un vector con 0's y 1's, y tengo que ver cuando hay 600 o
más unos seguidos. Se me ocurrió hacerlo con un loop for. Pero tarda
demasiado. También intente usar which para que seleccione solo los 1
para empezar a sumar pero no hay gran diferencia. A alguien se le
ocurre alguna solución para hacerlo más rápido?

Acá está el código con los datos de prueba:

test<-rep(c(rep(0,5),rep(1,601),rep(0,100),rep(1,100),rep(0,3),rep(1,200),rep(0,300),rep(1,1000)),100)
loop<-numeric()
for (i in 1:length(test)) {
    loop[i]<-sum(test[i:(i+600)])
    }

loop2<-numeric()
for (i in which(test==1)) {
    loop2[i]<-sum(test[i:(i+600)])
}



Muchas gracias a todos los que contesten.
Luciano

_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es 

___________________________________________________________________________

Aviso:
=====

El contenido del presente e-mail y sus posibles adjuntos pertenecen al INTA y pueden contener información confidencial. Si usted no es el destinatario original de este mensaje y por este medio pudo acceder a dicha información, por favor solicitamos contactar al remitente y eliminar el mensaje de inmediato. Se encuentra prohibida la divulgación, copia, distribución o cualquier otro uso de la información contenida en el presente e-mail por parte de personas distintas al destinatario. 


This e-mail contents and its possible attachments belong to INTA and may contain confidential information. If this message was not originally addressed to you, but you have accessed to such information by this means, please contact the sender and eliminate this message immediately. Circulation, copy, distribution, or any other use of the information contained in this e-mail is not allowed on part of those different from the addressee.


Antes de imprimir este mensaje, asegúrese de que sea necesario. Proteger el medio ambiente está también en su mano.



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