仅当 r 中满足条件时,数据帧内的增量计数器

Ori*_*rat 4 counter r data.table

我想创建一个仅在满足条件时增加的累积增量计数器。

DT <- data.table(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2), 
               b = c(10L, 5L, 3L, 4L, 2L, 6L, 1L, 3L, 5L, 7L))
Run Code Online (Sandbox Code Playgroud)

我没有得到想要的结果,rleid因为当连续行中满足两个条件时,不会执行增量

> DT[,count := rleid(b>=5),id]
> DT
    id  b count
 1:  1 10     1
 2:  1  5     1
 3:  1  3     2
 4:  1  4     2
 5:  1  2     2
 6:  1  6     3
 7:  1  1     4
 8:  2  3     1
 9:  2  5     2
10:  2  7     2
Run Code Online (Sandbox Code Playgroud)

预期的结果是

> DT
    id  b count
 1:  1 10     1
 2:  1  5     2
 3:  1  3     2
 4:  1  4     2
 5:  1  2     2
 6:  1  6     3
 7:  1  1     3
 8:  2  3     1
 9:  2  5     2
10:  2  7     3
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

这是一个选项cumsum。按'id'分组,得到逻辑表达式( b >= 5)的累计和。对于 'id' 2,大于或等于 5 的第一个元素位于位置 2(在分组位置中),因此第一行将为 0。为了使此为 1,一个选项是将其转换为factor和然后强制为整数,以便我们获得整数存储值(R索引从 1 开始)

DT[, count := as.integer(factor(cumsum(b >= 5))), id]
Run Code Online (Sandbox Code Playgroud)

-输出

DT
    id  b count
 1:  1 10     1
 2:  1  5     2
 3:  1  3     2
 4:  1  4     2
 5:  1  2     2
 6:  1  6     3
 7:  1  1     3
 8:  2  3     1
 9:  2  5     2
10:  2  7     3
Run Code Online (Sandbox Code Playgroud)