Tengo un valor por hora. Quiero contar cuántas horas consecutivas el valor ha sido cero desde la última vez que no fue cero. Este es un trabajo fácil para una hoja de cálculo o para un bucle, pero estoy esperando un snappy vectorizado de una sola línea para completar la tarea.Cuenta cuántos valores consecutivos son verdaderos
x <- c(1, 0, 1, 0, 0, 0, 1, 1, 0, 0)
df <- data.frame(x, zcount = NA)
df$zcount[1] <- ifelse(df$x[1] == 0, 1, 0)
for(i in 2:nrow(df))
df$zcount[i] <- ifelse(df$x[i] == 0, df$zcount[i - 1] + 1, 0)
salida deseada:
R> df
x zcount
1 1 0
2 0 1
3 1 0
4 0 1
5 0 2
6 0 3
7 1 0
8 1 0
9 0 1
10 0 2
+1 brillante de una sola línea. Poco código de perfiles: '(! X) * unlist (lapply (rle (x) $ lengths, seq_len))' ('lapply' es más seguro y más rápido,' seq_len' es la versión simplificada de 'seq'), aproximadamente 2 veces más rápido . – Marek
Gracias @Marek. Un par de cosas son nuevas para mí: 'seq_len' es más rápido, es bueno saberlo; y por qué 'lapply' es más seguro? Además 'rle' no es particularmente rápido; Tengo esta sensación persistente de que hay una forma de hacer esto mucho más rápido usando operaciones puramente aritméticas sin tener que dividir una matriz y volver a armar, etc. (por ejemplo, algo que involucre 'cumsum'). –
'lapply' siempre le da una lista,' sapply' algunas veces no, p. Ej. prueba tu código para 'x <- c (0,0,1,1,0,0,1,1)'. Además de 'lapply' es suficiente aquí, ¿por qué utilizar la función basada en él? – Marek