在价值变化时增加反击

时间:2017-01-08 16:43:46

标签: r

每当矢量中的值发生变化时,我都会创建一个增加计数器的函数:

track_change = function(x) {
  counter = numeric(length(x))
  for (i in seq_along(x)) {
    if (i > 1 && x[i] != x[i-1])
      counter[i] = counter[i-1] + 1
    else if (i > 1)
      counter[i] = counter[i-1]
  }
  counter
}

示例(了解track每次更改后carb的变化情况):

mtcars$track = track_change(mtcars$carb)

head(mtcars[, 10:12])
                  gear carb track
Mazda RX4            4    4     0
Mazda RX4 Wag        4    4     0
Datsun 710           4    1     1
Hornet 4 Drive       3    1     1
Hornet Sportabout    3    2     2
Valiant              3    1     3

在R中有更好的方法吗? (它还应该能够跟踪非数字向量的变化,包括列表。)

1 个答案:

答案 0 :(得分:0)

我们可以使用rleid

中的data.table执行此操作
library(data.table)
rleid(mtcars$carb)-1

rle

中的base R
inverse.rle(within.list(rle(mtcars$carb), values <- seq_along(values))) - 1