Buenas tardes Luciano,

Esta es una solución utilizando rle():

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)
names(test) <- 1:length(test)
res <- rle(test)$lengths
f <- names(res[res > 600])
f[f != ""]

Los resultados obtenidos con el programa enviado por Gabriela Cendoya y los
proporcionados por rle() son equivalentes:

res <- rle(test)$lengths
f <- names(res[res > 600])
resjiv <- f[f != ""]

test0 <- test[test==0]
filas <- as.numeric(names(test0))
resgab <- names(test0)[c(names(test0)[1]>600,diff(filas)>600)]

identical(resjiv, resgab)
# [1] TRUE

Sin embargo, si la eficiencia es relevante y no quieres "hackear" la función
rle(), te sugeriría trabajar con la solución enviada por Gabriela. Esto
demuestra una vez más que trabajar con funciones vectorizadas es un poco más
eficiente.

Estos son los tiempos para 100 réplicas:

# rle()
system.time(replicate(100, {
                                     res <- rle(test)$lengths
                                     f <- names(res[res > 600])
                                     f[f != ""]
                                       }
                                )
                              )
#   user  system elapsed
#  10.49    0.19   10.69

# Gabriela
system.time(replicate(100, {
                                        test0 <- test[test==0]
                                        filas <- as.numeric(names(test0))

 names(test0)[c(names(test0)[1]>600,diff(filas)>600)]
                                      }
                              )
                          )
#    user  system elapsed
#   4.93    0.05    4.98


Espero sea de utilidad,
                          Jorge Ivan Velez


2009/11/2 Luciano Selzer <>

> 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@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>

	[[alternative HTML version deleted]]

