按日期对同一组中的连续值求和

时间:2019-06-20 21:48:29

标签: r

我试图对具有相同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

条纹列是所需的输出,日期在原始数据框中的顺序不正确,我认为这是问题所在。

1 个答案:

答案 0 :(得分:1)

使用排序索引o,通过student_iddate对原始数据帧进行排序。现在,将cumsumstudent_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