删除少于三个周期的指标制度

Remove indicator regimes that are less than three periods

我正在寻求有关以下问题的帮助。

假设我有一个指标变量:

ind <- c(0,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0)

我的指标变量更长,所以这不是特定问题。

我有兴趣编写一个执行以下操作的循环:

如果上面向量中连续的 1 小于 3,则将其保留为零。

即我想删除频繁的状态转换,其中 1 只是 1 或两个周期。

最终向量应如下所示:

ind <- c(0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0)

如能提供帮助,我们将不胜感激!

尼克

我们可以使用rle来做到这一点。我们得到 'ind' 的 rle,通过子集 'lengths' 小于 3 的值 1 (!!values) 来更改 'values',分配相应的 'values' 到 0,并使用 inverse.rle 将输出转换回 vector.

inverse.rle(within.list(rle(ind), values[!!values][lengths[!!values]<3] <- 0))
#[1] 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0

或者更紧凑的版本是

inverse.rle(within.list(rle(ind), values[values & lengths<3] <- 0))
# [1] 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0