这个问题在这里已有答案:
让我们考虑如下的二进制序列
00001001110000011000000111111
我想计算序列中重复的1,如下所示
00001001230000012000000123456
我在考虑以下解决方案
> b<-c(0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1)
> rle(b)
Run Length Encoding
lengths: int [1:8] 4 1 2 3 5 2 6 6
values : num [1:8] 0 1 0 1 0 1 0 1
但“长度”和“数字”的结果不适用于我的情况。
我们可以使用来自rleid
的内置函数data.table
作为ave
中的分组变量,获取序列并与'b'相乘,以便在乘法后0的任何值都为0
library(data.table)
ave(b, rleid(b), FUN = seq_along)*b
#[1] 0 0 0 0 1 0 0 1 2 3 0 0 0 0 0 1 2 0 0 0 0 0 0 1 2 3 4 5 6
或者使用来自rle
的base R
,我们通过使用'lengths'复制'values'的序列来创建一个组,然后像以前一样在ave
中使用它
grp <- with(rle(b), rep(seq_along(values), lengths))
ave(b, grp, FUN = seq_along)*b
#[1] 0 0 0 0 1 0 0 1 2 3 0 0 0 0 0 1 2 0 0 0 0 0 0 1 2 3 4 5 6