2009-10-01 14 views
40

En R, ¿cuál sería la forma más eficiente/más simple de contar carreras de elementos idénticos en una secuencia?¿Cómo puedo contar ejecuciones en una secuencia?

Por ejemplo, la forma de contar el número de ceros consecutivos en una secuencia de números enteros no negativos:

x <- c(1,0,0,0,1,0,0,0,0,0,2,0,0) # should give 3,5,2 
+0

¿Quieres respuestas en R? Si es así, probablemente sea prudente comenzar la pregunta con "In R ..." en lugar de solo tener una etiqueta R. – slim

+0

Nota: esto no funciona con ejecuciones de NA o NaN (siempre se tratan como no contiguas). Una solución alternativa de hack horrible sería asignar NA y NaN a algunos valores enteros de centinela. – smci

Respuesta

62

Uso RLE():

y <- rle(c(1,0,0,0,1,0,0,0,0,0,2,0,0)) 
y$lengths[y$values==0] 
+0

¿Y cómo trazarías un histograma a partir de esta información? Imagine que tengo números del 1 al 100 y secuencias de diferentes longitudes. Y quiero crear el histograma que muestre la frecuencia con la que se realizan ejecuciones de cierta duración o se producen números o ambas cosas. – skan

+4

Este no es el lugar para una nueva pregunta. –

20

Esto se puede hacer de manera eficiente forma mediante el uso de índices, donde los valores cambian:

x <- c(1,0,0,0,1,2,1,0,0,1,1) 

localizar el punto donde cambian los valores:

diffs <- x[-1L] != x[-length(x)] 

Obtener los índices, y luego obtener la diferencia en los índices siguientes:

idx <- c(which(diffs), length(x)) 
diff(c(0, idx)) 
+0

Eso es esencialmente lo que está haciendo rle(). –

+1

Lo siento, Rob. Lo escribí en mi iPhone anteriormente, y no hay una "aplicación para eso". :). ¡Vote por la respuesta de Rob en lugar de la mía! – Shane

+5

+1: Si bien 'rle()' es una manera más fácil de responder la pregunta del OP, esta solución tiene otras ventajas en algunos casos. En particular, estaba buscando una forma de numerar cada ejecución de forma única en lugar de contar las ejecuciones y encontré que podía hacer eso con 'c (0, cumsum (x [-1L]! = X [-length (x)])) '. – Simon

Cuestiones relacionadas