2017-12-13 89 views
10

Tôi có khung dữ liệu sau:R- Làm cách nào để thực hiện tổng tích lũy với các ID duy nhất?

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)) 

Trên mỗi ngày, tôi muốn có một số tiền tích lũy của những giá trị độc đáo, chăm chỉ giá trị mới nhất cho một mục lặp lại. sản lượng dự kiến ​​của tôi là như sau:

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 

nơi entry 5 cho biết thêm lên giá trị 2, 3, 4, 5 (vì A lặp đi lặp lại) và sự xâm nhập 6 cho biết thêm lên giá trị 3, 4, 5 và 6 (vì lặp lại cả A và B). Mục nhập thứ 7 khởi động lại vì đó là ngày mới.

Tôi không nghĩ mình có thể sử dụng cumsum() vì nó chỉ chấp nhận 1 tham số. Tôi cũng không muốn giữ một bộ đếm cho mỗi ID vì tôi có thể có tối đa 100 ID duy nhất mỗi ngày.

Bất kỳ gợi ý hoặc trợ giúp nào sẽ được đánh giá cao! Cảm ơn bạn!

Trả lời

5

Bạn có thể chênh lệch các giá trị bằng ID và ngày và sau đó sử dụng 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 

cơ sở R tương tự ...

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 
Các vấn đề liên quan