R 子级数的计数长度

R 子级数的计数长度,r,R,想象一系列数字,如 c(21,22,23,30,31,32,34,35,36,37,38,50,NA,52) 其中子列定义为:如果x[t]=x[t-1]+1,则x[t]是某个子列的一部分 因此,在上面的示例中,我们有以下系列: c(21,22,23,30,31,32,34,35,36,37,38,50,NA,52) ## 1 1 1 2 2 2 3 3 3 3 3 4 - 5 # serie ID ## 3 | 3 | 5

想象一系列数字,如

c(21,22,23,30,31,32,34,35,36,37,38,50,NA,52)
其中子列定义为:如果x[t]=x[t-1]+1,则x[t]是某个子列的一部分

因此,在上面的示例中,我们有以下系列:

c(21,22,23,30,31,32,34,35,36,37,38,50,NA,52)
## 1  1  1  2  2  2  3  3  3  3  3  4  -  5    # serie ID
##    3    |   3    |      5      | 1 | | 1    # length

标记子序列并将其长度作为单个函数或两个单独的函数进行计数的最有效方法是什么?

我们可以得到相邻元素之间的差值,检查它是否等于1,得到累积和,并将其作为一个组来获得向量的长度

unname(tapply(v1, cumsum(c(TRUE, diff(replace(v1, is.na(v1), 0))!=1)), length))
#[1] 3 3 5 1 1 1
如果我们需要NA元素作为

或者@DavidArenburg发布的带有rle的变体


我们可以得到相邻元素之间的差值,检查它是否等于1,得到累积和,并将其作为一个组来获得向量的长度

unname(tapply(v1, cumsum(c(TRUE, diff(replace(v1, is.na(v1), 0))!=1)), length))
#[1] 3 3 5 1 1 1
如果我们需要NA元素作为

或者@DavidArenburg发布的带有rle的变体


我接受了akrun的答案和David Arenburg的贡献,但作为参考,我提供了一个我同时创建的Rcpp解决方案

数字向量cpp_系列长度分光镜x{ int n=x.长度; 如果n==1 返回wrap1; 数字矢量输出; int-tmpCount=1; int prevStart=0; 对于int i=0;i对于int j=prevStart;j我接受akrun的答案和David Arenburg的贡献,但作为参考,我提供了我同时创建的Rcpp解决方案

数字向量cpp_系列长度分光镜x{ int n=x.长度; 如果n==1 返回wrap1; 数字矢量输出; int-tmpCount=1; int prevStart=0; 对于int i=0;irle(cumsum(c(TRUE, diff(replace(v1, is.na(v1), 0))!=1)))$lengths