1

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

假设我有一个指示变量:

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)

任何有助于使这种动态的帮助将不胜感激!

网卡

4

1 回答 1

2

我们可以用它rle来做到这一点。我们得到rle'ind',通过将 '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
于 2015-09-02T16:15:54.373 回答