2017-12-13 112 views
10

Mam następujący ramkę danych:R- Jak wykonać sumę skumulowaną z unikatowymi identyfikatorami?

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

w każdym dniu, chciałbym skumulowaną sumę unikatowych wartości, biorąc tylko ostatnią wartość dla wpisu, który powtarza. My oczekiwany wynik wygląda następująco:

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 

gdzie 5th wejście dodaje się wartości 2, 3, 4, 5 (ponieważ powtórzenie) i 6. wejście dodaje się wartości 3, 4, 5 oraz 6 (z powodu powtórzyć A i B). Siódmy wpis rozpoczyna się ponownie, ponieważ jest to nowy dzień.

Nie sądzę, że mogę użyć funkcji cumsum(), ponieważ akceptuje tylko jeden parametr. Nie chcę również przechowywać licznika dla każdego identyfikatora, ponieważ mogę mieć do 100 unikalnych identyfikatorów dziennie.

Wszelkie wskazówki lub pomoc będą mile widziane! Dziękuję Ci!

Odpowiedz

5

Można różnica wartości, tożsamości i dzień, a następnie użyć 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 

Baza R analogowe ...

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 
Powiązane problemy