Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 值改变时增加计数器_R - Fatal编程技术网

R 值改变时增加计数器

R 值改变时增加计数器,r,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-

我做了一个函数,每当向量中的值发生变化时,增加一个计数器:

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
}
示例(请参见每次更改
carb
时如何更改
跟踪
):


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

我们可以通过
数据中的
rleid
来实现这一点

library(data.table)
rleid(mtcars$carb)-1

或者使用
rle
from
base R

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

inverse.rle(in.list(rle)(mtcars$carb),谢谢。在我的数据上,
for loop
解决方案实际上比
rle
方法快5-10%(仅供参考)。@jakub我想说,你应该在一个更大的数据集上检查基准,即大约一百万或更多的数据点
inverse.rle(within.list(rle(mtcars$carb), values <- seq_along(values))) - 1