我想这就是你要找的东西:
library(data.table)
setDT(DF)[, count := seq_len(.N), by=.(id,rleid(random))]
Run Code Online (Sandbox Code Playgroud)
这使
id random count
1: a 0 1
2: a 1 1
3: a 1 2
4: a 0 1
5: a 0 2
6: a 1 1
7: a 0 1
8: a 1 1
9: a 0 1
10: b 0 2
11: b 0 3
12: b 1 1
13: b 0 1
14: b 1 1
15: b 0 1
16: b 0 2
17: b 0 3
Run Code Online (Sandbox Code Playgroud)
(在data.table包的下一个版本1.9.8中,会有一个小的快捷方式setDT(DF)[, count := rowid(rleid(random)), by=id].我正在制作这个注释,所以我可以稍后更新答案.)
您可能还需要运行组的标识符:
DF[, rid := rleid(random), by=id]
Run Code Online (Sandbox Code Playgroud)
这使
id random count rid
1: a 0 1 1
2: a 1 1 2
3: a 1 2 2
4: a 0 1 3
5: a 0 2 3
6: a 1 1 4
7: a 0 1 5
8: a 1 1 6
9: a 0 1 7
10: b 0 1 1
11: b 0 2 1
12: b 1 1 2
13: b 0 1 3
14: b 1 1 4
15: b 0 1 5
16: b 0 2 5
17: b 0 3 5
Run Code Online (Sandbox Code Playgroud)
如果您仔细阅读了包装上的介绍材料,您会发现这些变量也可以在一个步骤中创建.