簡體   English   中英

如何在 R 中使用 dplyr mutate function 來計算運行余額?

[英]How to use dplyr mutate function in R to calculate a running balance?

在底部的 MWE 代碼中,我試圖在從一行運行到下一行時為每個唯一 ID 生成運行余額。 例如,運行以下代碼時,output 應該是:

data2 <- 

 id plusA plusB minusC running_balance  [desired calculation for running balance]
  1     3     5    10              -2   3 + 5 - 10 = -2
  2     4     5     9               0   4 + 5 - 9 = 0
  3     8     5     8               5   8 + 5 - 8 = 5
  3     1     4     7               3   id doesn't change so 5 from above + (1 + 4 - 7) = 3
  3     2     5     6               4   id doesn't change so 3 from above + (2 + 5 - 6) = 4
  5     3     6     5               4   3 + 6 - 5 = 4

下面的MWE是指,當id從一行到下一行一致時,前一行running_balance plusA 我已經嘗試將以下內容更改為某種形式的lag(running_balance...)卻沒有運氣。

我試圖盡量減少使用太多包。 例如,我了解purrr package 提供了一個accumulate() function,但我現在寧願只堅持dplyr 有沒有一種簡單的方法可以做到這一點,在我的情況下使用 dplyr mutate() 我還嘗試擺弄 dplyr cumsum() function 應該在這里工作,但我不確定如何將它們中的幾個串在一起。

MWE代碼:

data <- data.frame(id=c(1,2,3,3,3,5), 
                   plusA=c(3,4,8,1,2,3), 
                   plusB=c(5,5,5,4,5,6),
                   minusC = c(10,9,8,7,6,5))

library(dplyr)
data2<- subset(
  data %>% mutate(extra=case_when(id==lag(id) ~ lag(plusA), TRUE ~ 0)) %>%
    mutate(running_balance=plusA+plusB-minusC+extra),
  select = -c(extra)
)  

使用dplyr

data %>% 
  mutate(running_balance = plusA + plusB - minusC) %>% 
  group_by(id) %>% 
  mutate(running_balance = cumsum(running_balance)) %>% 
  ungroup()

Output:

# A tibble: 6 x 5
# Groups:   id [4]
     id plusA plusB minusC running_balance
  <dbl> <dbl> <dbl>  <dbl>           <dbl>
1     1     3     5     10              -2
2     2     4     5      9               0
3     3     8     5      8               5
4     3     1     4      7               3
5     3     2     5      6               4
6     5     3     6      5               4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM