2012-05-14 16 views
6

Necesito descomponer un vector en una serie de x y repetir, no estoy muy seguro de cuál es el término adecuado para esto. Es el inverso de la función rep. Así un vectorcomprimir vector en (inverso de rep)

[1,2,2,2,2,1,1,1,1,1,2,2] -> [1x1, 4x2, 5x1, 2x2] 

me escribió una pequeña función para hacer esto, pero estoy seguro de que debe haber una manera más orígenes:

invrep <- function(y){ 
    numy <- as.numeric(y); 
    newpoints <- which(c(T,diff(numy) != 0)); 
    x <- y[newpoints]; 
    times <- diff(c(newpoints, length(numy)+1)); 
    return(list(x=x, times=times)); 
} 

myvec <- factor(floor(runif(50,0,3)), levels=0:2, labels=c("blue", "yellow", "red")); 
myrep <- invrep(myvec); 
identical(myvec, rep(myrep$x, myrep$times)); 
+2

'sort' +' rle'? ¿O simplemente 'tabla'? No lo entiendo del todo – joran

+0

Dang Joran me ganó. Joran, probablemente deberías darle esa respuesta, ya que supongo que es la mejor o la mejor. –

+0

@Joran es simplemente 'rle' sin ningún' tipo' – smci

Respuesta

10

La función rle debe hacer el truco:

> x <- c(1,2,2,2,2,1,1,1,1,1,2,2) 
> y <- rle(x) 
> y 
Run Length Encoding 
    lengths: int [1:4] 1 4 5 2 
    values : num [1:4] 1 2 1 2 
> inverse.rle(y) 
[1] 1 2 2 2 2 1 1 1 1 1 2 2 
> rep(y$values, y$lengths) 
[1] 1 2 2 2 2 1 1 1 1 1 2 2 

ACTUALIZACIÓN Como se comentó @TylerRinker, utilice as.character de factores:

myvec <- factor(sample.int(3,50,TRUE), levels=1:3, labels=c("blue", "yellow", "red")) 
x <- rle(as.character(myvec)) 
y <- inverse.rle(x) 
+0

para trabajar en el vector de factores siempre que tenga que convertirlo en carácter como en: 'rle (as.character (myvec))' +1 y si pudiera, sería +2 porque no sabía por el 'inverse.rle'. –

+0

@TylerRinker - Gracias, respuesta actualizada. – Tommy