获取向量中缺失值的运行长度
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 的解决方案那样紧凑和优雅。
这是另一个选项 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
获取向量中缺失值的每个拼写长度的巧妙(即,不是循环)方法是什么?我的理想输出是一个长度相同的向量,其中每个缺失值都被它所属的缺失值拼写的长度替换,所有其他值都是 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 的解决方案那样紧凑和优雅。
这是另一个选项 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