我试图对具有相同student_id并按日期排序的连续值求和。
我尝试使用sequence(rle()),但按日期排序不起作用。
row student_id date pass/fail streak
1 2 2019-05-24 0 0
2 2 2019-05-25 -1 -1
3 1 2019-05-24 1 2
4 1 2019-05-28 -1 -1
5 2 2019-05-23 1 1
6 1 2019-05-27 1 3
7 2 2019-05-28 -1 -2
8 1 2019-05-23 1 1
条纹列是所需的输出,日期在原始数据框中的顺序不正确,我认为这是问题所在。
答案 0 :(得分:1)
使用排序索引o
,通过student_id
和date
对原始数据帧进行排序。现在,将cumsum
和student_id
的{{1}}和pass/fail
应用于pass/fail
,最后恢复到原始顺序。
library(data.table)
o <- with(DF, order(student_id, date))
transform(DF[o, ],
streak = ave(`pass/fail`, rleid(student_id, `pass/fail`), FUN = cumsum))[order(o), ]
给予:
ow student_id date pass.fail streak
1 1 2 2019-05-24 0 0
2 2 2 2019-05-25 -1 -1
3 3 1 2019-05-24 1 2
4 4 1 2019-05-28 -1 -1
5 5 2 2019-05-23 1 1
6 6 1 2019-05-27 1 3
7 7 2 2019-05-28 -1 -2
8 8 1 2019-05-23 1 1
可复制形式的输入:
Lines <- "ow student_id date pass/fail streak
1 2 2019-05-24 0 0
2 2 2019-05-25 -1 -1
3 1 2019-05-24 1 2
4 1 2019-05-28 -1 -1
5 2 2019-05-23 1 1
6 1 2019-05-27 1 3
7 2 2019-05-28 -1 -2
8 1 2019-05-23 1 1"
DF <- read.table(text = Lines, header = TRUE, check.names = FALSE)
DF$date <- as.Date(DF$date)
DF$streak <- NULL