如何仅使用唯一ID执行累积和?

Ann*_*nna 10 r

我有以下数据框:

d<-data.frame(Day=c(1, 1, 1, 1, 1, 1, 2), ID=c("A", "B", "C", "D", "A", "B", "B"), Value=c(1, 2, 3, 4, 5, 6, 7))
Run Code Online (Sandbox Code Playgroud)

在每一天,我想要一个累积的唯一值,只取一个重复的条目的最新值.我的预期产量如下:

d<-data.frame(Day=c(1, 1, 1, 1, 1, 1, 2), ID=c("A", "B", "C", "D", "A", "B", "B"), Value=c(1, 2, 3, 4, 5, 6, 7), Sum=c(1, 3, 6, 10, 14, 18, 7))

  Day ID Value Sum
1   1  A     1   1
2   1  B     2   3
3   1  C     3   6
4   1  D     4  10
5   1  A     5  14
6   1  B     6  18
7   2  B     7   7
Run Code Online (Sandbox Code Playgroud)

其中第5个条目加起来值2,3,4,5(因为A重复)和第6个条目加起来值3,4,5和6(因为A和B都重复).第7个条目重新启动,因为它是新的一天.

我不认为我可以使用cumsum(),因为它只接受1个参数.我也不想为每个ID保留一个计数器,因为我每天最多可以有100个唯一ID.

任何提示或帮助将不胜感激!谢谢!

Fra*_*ank 5

您可以按ID和日区分值,然后使用cumsum:

library(data.table)
setDT(d)
d[, v_eff := Value - shift(Value, fill=0), by=.(Day, ID)]
d[, s := cumsum(v_eff), by=Day]

   Day ID Value Sum v_eff  s
1:   1  A     1   1     1  1
2:   1  B     2   3     2  3
3:   1  C     3   6     3  6
4:   1  D     4  10     4 10
5:   1  A     5  14     4 14
6:   1  B     6  18     4 18
7:   2  B     7   7     7  7
Run Code Online (Sandbox Code Playgroud)

Base R analogue ...

d$v_eff <- with(d, ave(Value, Day, ID, FUN = function(x) c(x[1], diff(x)) ))
d$s <- with(d, ave(v_eff, Day, FUN = cumsum))

  Day ID Value Sum v_eff  s
1   1  A     1   1     1  1
2   1  B     2   3     2  3
3   1  C     3   6     3  6
4   1  D     4  10     4 10
5   1  A     5  14     4 14
6   1  B     6  18     4 18
7   2  B     7   7     7  7
Run Code Online (Sandbox Code Playgroud)