获取向量中缺失值的连续长度

4
有没有一种巧妙的(即不使用循环)方法来获取向量中每个缺失值序列的长度? 我理想的输出是一个相同长度的向量,其中每个缺失值被替换为其所属的缺失值序列的长度,所有其他值都是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)
3个回答

10

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

2
rep(rle(is.na(x))$value * rle(is.na(x))$length, rle(is.na(x))$length)。这也是有效的。 - JasonWang

1

我正在独立地使用 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的解决方案那样紧凑和优雅。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接