什么是一种聪明的(即非循环)方式来获取向量中每个缺失值的长度?我的理想输出是一个长度相同的向量,其中每个缺失值被缺失值的法术长度替换,其中所有其他值都是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)
答案 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)
以下是rleid
和ave
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