我需要将一个向量分解成一系列x并重复,我不确定这个词的正确用语是什么。它是rep
函数的反函数。所以一个载体
[1,2,2,2,2,1,1,1,1,1,2,2] -> [1x1, 4x2, 5x1, 2x2]
我写了一个小功能来做到这一点,但我确信必须有更原生的方式:
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));
答案 0 :(得分:10)
rle
函数应该可以解决问题:
> 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
更新在@TylerRinker评论时,请使用as.character
因素:
myvec <- factor(sample.int(3,50,TRUE), levels=1:3, labels=c("blue", "yellow", "red"))
x <- rle(as.character(myvec))
y <- inverse.rle(x)