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

Get length of runs of missing values in vector

获取向量中缺失值的每个拼写长度的巧妙(即,不是循环)方法是什么?我的理想输出是一个长度相同的向量,其中每个缺失值都被它所属的缺失值拼写的长度替换,所有其他值都是 0。

所以,对于像这样的输入:

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)

使用 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

我正在独立地使用 rle()cumsum()dplyr group_by()n() 来获得 NA 的组长度:

> 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 的解决方案那样紧凑和优雅。

这是另一个选项 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