Agregue índice a ejecuciones contiguas de valores iguales
performance loops (3)
Esto funcionará con valores numéricos de caracteres:
rep(1:length(rle(x)$values), times = rle(x)$lengths)
#[1] 1 2 3 4 5 5 6 7 7 8 8 8 9
También puede ser un poco más eficiente llamando a
rle
solo una vez (aproximadamente 2 veces más rápido) y se puede hacer una mejora de velocidad
muy
leve usando
rep.int
lugar de
rep
:
y <- rle(x)
rep.int(1:length(y$values), times = y$lengths)
¿Existe una forma más rápida de hacer un índice de contador que usando un bucle? Dentro de series contiguas de valores iguales, el índice debe ser el mismo. Encuentro el bucle muy lento, especialmente cuando los datos son tan grandes.
Por ejemplo, aquí está la entrada y la salida deseada
x <- c(2, 3, 9, 2, 4, 4, 3, 4, 4, 5, 5, 5, 1)
Contador resultante deseado:
c(1, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9)
Tenga en cuenta que
las
ejecuciones
no
contiguas tienen índices
diferentes
.
Por ejemplo, vea los índices deseados de los valores
2
y
4
Mi código ineficiente es este:
group[1]<-1
counter<-1
for (i in 2:n){
if (x[i]==x[i-1]){
group[i]<-counter
}else{
counter<-counter+1
group[1]<-counter}
}
Si tiene valores numéricos como este, puede usar
diff
y
cumsum
para sumar cambios en los valores
x <- c(2,3,9,2,4,4,3,4,4,5,5,5,1)
cumsum(c(1,diff(x)!=0))
# [1] 1 2 3 4 5 5 6 7 7 8 8 8 9
Usando
data.table
, que tiene la función
rleid()
:
require(data.table) # v1.9.5+
rleid(x)
# [1] 1 2 3 4 5 5 6 7 7 8 8 8 9