将数字向量转换为 R 中的连续整数

Convert a vector of a numbers to consecutive integers in R

我有一个整数向量 x <- c(5, 5, 4, 4, 4, 8, 8, 8, 8, 5, 5, 9, 4, 4, 5, 5) 并且想要创建一个相同长度的新向量。这个新向量从 1 开始,如果 x 中的值与前一个值没有变化,则该值保持不变;只要 x 有变化,该值就应该增加 1。所以期望的结果是1 1 2 2 2 3 3 3 3 4 4 5 6 6 7 7。换句话说,结果是 x.

中运行的标签

我现在有一个 for 循环,如下所示。但我想知道是否有一些函数或矢量化方法可以做到这一点。

x <- c(5, 5, 4, 4, 4, 8, 8, 8, 8, 5, 5, 9, 4, 4, 5, 5)
n <- length(x)
y <- rep(NA, n)
y[1] <- 1
for (i in 2:n) {
  if (x[i] == x[i - 1]) {
    y[i] <- y[i - 1]
  }
  else {
    y[i] <- y[i - 1] + 1
  }
}
> y
 [1] 1 1 2 2 2 3 3 3 3 4 4 5 6 6 7 7
tmp=rle(x)
rep(seq_along(tmp$values),tmp$lengths)
[1] 1 1 2 2 2 3 3 3 3 4 4 5 6 6 7 7

一个选项可以是:

cumsum(c(0, diff(x)) != 0) + 1

 [1] 1 1 2 2 2 3 3 3 3 4 4 5 6 6 7 7