如何生成前一年的个人有其当前的X分数?

Bor*_*ris 3 r function dataframe

我想简单地生成一个变量来计算个人当前得分的前几年数.

例如,如果我们从这个可重复的例子中查看personID

set.seed(987)
mydata <- data.frame(
  personID  = rep(c(1:10), each = 10),
  year= rep(c(1991:2000), each = 1),
  score = sample(c(0, 1, 2), 100, replace = TRUE)
)
Run Code Online (Sandbox Code Playgroud)

这是personI == 5

personID    year    score
5           1991    2
5           1992    1
5           1993    0
5           1994    0
5           1995    0
5           1996    0
5           1997    2
5           1998    0
5           1999    1
5           2000    1
Run Code Online (Sandbox Code Playgroud)

我想要生成的是变量Z,它应该是这样的

personID    year    score   Z
5           1991       2    0
5           1992       1    0
5           1993       0    0
5           1994       0    1
5           1995       0    2
5           1996       0    3
5           1997       2    0
5           1998       0    0
5           1999       1    0
5           2000       1    1
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用此代码执行此操作

mydata1 <- with(mydata, ave(score, personID, FUN= 
                      function(x) cumsum(c(TRUE, diff(x)<0))))
mydata$Z <- with(mydata, ave(mydata1, mydata1, personID, FUN= seq_along)-1)
Run Code Online (Sandbox Code Playgroud)

它没有完成工作,我需要以某种方式指定我想要计算的是当前分数(个人得分0,1或2时的年数).该diff(x)<0部分也是错误的 - 我尝试了不同的东西,最后不可能以某种方式删除它.

Dav*_*urg 5

data.table为方便起见,这是使用行程编码的可能解决方案

library(data.table)
setDT(mydata)[, Z := 1:.N - 1L, by = .(personID, rleid(score))]

# Check results
mydata[personID == 5]
#     personID year score Z
#  1:        5 1991     2 0
#  2:        5 1992     1 0
#  3:        5 1993     0 0
#  4:        5 1994     0 1
#  5:        5 1995     0 2
#  6:        5 1996     0 3
#  7:        5 1997     2 0
#  8:        5 1998     0 0
#  9:        5 1999     1 0
# 10:        5 2000     1 1
Run Code Online (Sandbox Code Playgroud)

或者使用开发版本(v> = 1.9.7),您可以使用它来增强它 rowid

setDT(mydata)[, Z := rowid(score) - 1L, by = .(personID, rleid(score))]
Run Code Online (Sandbox Code Playgroud)