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)
这是一个选项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)