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部分也是错误的 - 我尝试了不同的东西,最后不可能以某种方式删除它.
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)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |