2017-12-13 176 views
10

Aşağıdaki veri çerçevesini vardır:R- Yalnızca benzersiz kimliklerle kümülatif toplam nasıl gerçekleştirilir?

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

her gününde, tekrarlar bir giriş için yalnızca en son değer alarak benzersiz değerlerin kümülatif toplamı istiyorum. aşağıdaki gibi My beklenen çıktısı:

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 

5. giriş (kadar değerleri 2, 3, 4, 5 (A tekrarlar için) ve 6 giriş kadar değerleri, 3, 4, 5, ve 6, ekler ekler burada nedeniyle hem A hem de B tekrarı). 7. giriş yeni bir gün olduğu için yeniden başlıyor.

Sadece 1 parametre kabul ettiğinden, cumsum() kullanabileceğimi sanmıyorum. Ayrıca, her bir kimlik için günde 100'e kadar benzersiz kimliğe sahip olabileceğinden bir sayaç tutmak istemiyorum.

Herhangi bir ipucu ya da yardım için teşekkür ederiz! Teşekkür ederim!

cevap

5

Sen fark ardından kimliği ve Day and tarafından değerleri cumsum kullanabilirsiniz:

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 

Taban R analog ...

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