首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >压缩向量in (rep的倒数)

压缩向量in (rep的倒数)
EN

Stack Overflow用户
提问于 2012-05-15 04:04:55
回答 1查看 865关注 0票数 6

我需要将一个向量分解成一系列的x,然后重复,我不太确定这是什么术语。它是rep函数的逆函数。所以一个向量

代码语言:javascript
复制
[1,2,2,2,2,1,1,1,1,1,2,2] -> [1x1, 4x2, 5x1, 2x2]

我写了一个小函数来做这件事,但我相信一定有一种更本机的方法:

代码语言:javascript
复制
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));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-15 04:12:06

rle函数应该可以做到这一点:

代码语言:javascript
复制
> 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

UPDATE @TylerRinker评论,在因子上使用as.character

代码语言:javascript
复制
myvec <- factor(sample.int(3,50,TRUE), levels=1:3, labels=c("blue", "yellow", "red"))
x <- rle(as.character(myvec))
y <- inverse.rle(x)
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10590267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档