计算R中的序列

Ari*_*old 2 sequences r count

id  random  count
a   0        -1
a   1         1
a   1         2
a   0        -1
a   0        -2
a   1         1
a   0        -1
a   1         1
a   0        -1
b   0        -1
b   0        -2
b   1         1
b   0        -1
b   1         1
b   0        -1
b   0        -2
b   0        -3
Run Code Online (Sandbox Code Playgroud)

id是一个玩家,random是二进制的,0或者1,我想创建一个计数列,按玩家计算1和0的序列,最好没有循环,因为数据库非常大.

Fra*_*ank 6

我想这就是你要找的东西:

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)

如果您仔细阅读了包装上介绍材料,您会发现这些变量也可以在一个步骤中创建.