获取向量中缺少值的运行长度

时间:2017-03-21 19:54:43

标签: r vector vectorization na run-length-encoding

什么是一种聪明的(即非循环)方式来获取向量中每个缺失值的长度?我的理想输出是一个长度相同的向量,其中每个缺失值被缺失值的法术长度替换,其中所有其他值都是0' s。

因此,输入如:

x <- c(2,6,1,2,NA,NA,NA,3,4,NA,NA)

我喜欢输出:

y <- c(0,0,0,0,3,3,3,0,0,2,2)

3 个答案:

答案 0 :(得分:9)

使用rle的一个简单选项:

m <- rle(is.na(x))
> rep(ifelse(m$values,m$lengths,0),times = m$lengths)
[1] 0 0 0 0 3 3 3 0 0 2 2

答案 1 :(得分:1)

我使用rle()以及cumsum()dplyr group_by()n()独立处理某些内容以获取不同群组的NAs:

> x2 <- as.numeric(is.na(x))
  0 0 0 0 1 1 1 0 0 1 1

> rle(x2)
Run Length Encoding
  lengths: int [1:4] 4 3 2 2
  values : num [1:4] 0 1 0 1

# Now we can assign group-numbers...
> cumsum(c(diff(x2)==+1,0)) * x2
  0 0 0 0 1 1 1 0 0 2 2
# ...then get group-lengths from counting those...
> rle(cumsum(c(diff(x2)==+1,0)) * x2)
Run Length Encoding
  lengths: int [1:4] 4 3 2 2
  values : num [1:4] 0 1 0 2

我们可以解决问题,但它不会像@joran的解决方案那样紧凑和优雅。

答案 2 :(得分:1)

以下是rleidave

的另一个选项
library(data.table)
ave(x, rleid(is.na(x)), FUN = length)*is.na(x)
#[1] 0 0 0 0 3 3 3 0 0 2 2