2017-04-19 116 views
1

我正在尝试计算余额列。Dplyr滚动余额

所以,展现一个例子,我想从这个去:

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 

创建一个新的平衡柱像下面

> 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 

我尝试了以下尝试,但它不是”牛逼工作

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

会很感激一些帮助与此有关。谢谢!

+1

为什么'out'在'dfb'和'df'中有所不同? – mt1022

+0

只是修正了现在的 – tonyk

回答

2

您可以使用dplyrcumsum。注意:我必须更改您的初始df表以匹配您所需结果中的表,因为您在“出”中有不同的数据。

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

或者'balance = start [1] + cumsum(receipt-out)'。 – mt1022