2012-05-17 44 views
7

Si tengo un vector comocontar números consecutivos en un vector

"a": 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 

Quiero saber cuántos son 1 juntos en a, en este caso la respuesta sería 3 y 2.

Es Hay algún script que pueda hacer esto?

+6

que he visto al menos 3 preguntas en 2 días de personas que buscan 'rle' es una función oscuro, pero muy práctico. –

Respuesta

17

Ver ?rle.

## create example vector 
a <- c(rep(0, 3), rep(1, 3), rep(0, 4), rep(1, 2), rep(0, 3)) 

## count continuous values 
r <- rle(a) 

## fetch continuous length for value 1 
r$lengths[r$values == 1] 
# [1] 3 2 
+0

¿No es 'values' y no' value'? La coincidencia parcial con '$' encuentra la información correcta, pero también 'rle (a) $ v' para llevarlo al extremo. – thelatemail

7

¿Qué le parece esto?

test <- c(0,0,0,1,1,1,0,0,0,0,1,1,0,0,0) 
rle(test)$lengths[rle(test)$values==1] 
#[1] 3 2 

Para los datos masivos, puede acelerarlo un poco complicado el uso de algunos de selección:

diff(unique(cumsum(test == 1)[test != 1])) 
#[1] 3 2 
5

Otros han respondido a la pregunta. Me gustaría agregar dos observaciones:

Truco de entrada de datos: utilice el escaneo (predeterminado en la clase "numérico", sin necesidad de repeticiones o de coma) y también funciona para los caracteres separados por espacios en blanco si agrega "carácter" como un argumento.

a <- scan() 
1: 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 
16: 
Read 15 items 

rle es realmente la función inversa de rep

arle <- rle(a) 
rep(arle$values, arle$lengths) 
[1] 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 
+1

Pensé que era la función inversa para reverse.rle;) – Dason

+1

Bueno, supongo, pero ¿has mirado su código? –

Cuestiones relacionadas