2017-04-19 2 views
1

Ich versuche eine Balance-Spalte zu berechnen.Dplyr rollende Waage

So ein Beispiel zu zeigen, die ich von dieser hinwollen:

df <- data.frame(group = c("A", "A", "A", "A", "A"), 
        start = c(5, 0, 0, 0, 0), 
        receipt = c(1, 5, 6, 4, 6), 
        out = c(4, 5, 3, 2, 5)) 

> df 
    group start receipt out 
1  A  5  1 4 
2  A  0  5 5 
3  A  0  6 3 
4  A  0  4 2 
5  A  0  6 5 

zur Schaffung versucht, eine neue Balance Spalte wie folgt

> dfb 
    group start receipt out balance 
1  A  5  1 4  2 
2  A  0  5 5  2 
3  A  0  6 3  5 
4  A  0  4 2  7 
5  A  0  6 5  8 

ich den folgenden Versuch, aber es isn‘ t Arbeits

dfc <- df %>% 
     group_by(group) %>% 
     mutate(balance = if_else(row_number() == 1, start + receipt - out, (lag(balance) + receipt) - out)) %>% 
     ungroup() 

Würde schätzen wirklich etwas Hilfe mit diesem. Vielen Dank!

+1

Warum ist das 'out' in' dfb' und 'df' anders? – mt1022

+0

gerade behoben, dass jetzt – tonyk

Antwort

2

Sie könnten cumsum von dplyr verwenden. Hinweis: Ich musste Ihre ursprüngliche df Tabelle so ändern, dass sie mit der im gewünschten Ergebnis übereinstimmt, da Sie andere Daten in "out" haben.

df <- data.frame(group = c("A", "A", "A", "A", "A"), 
        start = c(5, 0, 0, 0, 0), 
        receipt = c(1, 5, 6, 4, 6), 
        out = c(4, 5, 3, 2, 5)) 
dfc <- df %>% 
     group_by(group) %>% 
     mutate(balance=cumsum(start+receipt-out)) 

Source: local data frame [5 x 5] 
Groups: group [1] 

    group start receipt out balance 
    <fctr> <dbl> <dbl> <dbl> <dbl> 
1  A  5  1  4  2 
2  A  0  5  5  2 
3  A  0  6  3  5 
4  A  0  4  2  7 
5  A  0  6  5  8 
+0

alternativ, balance = start [1] + cumsum (Empfang - out) '. – mt1022

Verwandte Themen