如何在 R 中使用 dplyr mutate 函数来计算运行余额?

Posted

技术标签:

【中文标题】如何在 R 中使用 dplyr mutate 函数来计算运行余额?【英文标题】:How to use dplyr mutate function in R to calculate a running balance? 【发布时间】:2022-01-22 15:32:02 【问题描述】:

在底部的 MWE 代码中,我试图在从一行运行到下一行时为每个唯一 ID 生成运行余额。例如,运行以下代码时,输​​出应为:

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从一行到下一行一致时,前一行plusA数量,而不是前一行running_balance数量。我尝试将以下内容更改为某种形式的lag(running_balance...),但还没有运气。

我正在尽量减少使用太多软件包。例如,我了解purrr 包提供了accumulate() 功能,但我现在宁愿只使用dplyr。有没有一种简单的方法可以做到这一点,在我的情况下使用 dplyr mutate() ?我还尝试摆弄 dplyr cumsum() 函数,它应该在这里工作,但我不确定如何将它们中的几个串在一起。

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

【问题讨论】:

【参考方案1】:

使用dplyr:

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

输出:

# 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

【讨论】:

非常优雅易懂,谢谢! 你可以使用data %&gt;% group_by(id) %&gt;% mutate(running_balance1 = cumsum(plusA + plusB - minusC))

以上是关于如何在 R 中使用 dplyr mutate 函数来计算运行余额?的主要内容,如果未能解决你的问题,请参考以下文章

R语言dplyr包使用dplyr函数使用group_by函数summarise函数和mutate函数计算分组占比实战

R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战

R语言dplyr包mutate_at函数通过名称修改指定数据列的内容(使用统一的函数)实战

R语言dplyr包mutate_all函数一次性处理所有的数据列的内容(使用统一的函数)实战

R语言dplyr包mutate_if函数修改所有满足条件的数据列的内容实战

R语言dplyr处理dataframe:使用mutate函数生成新的列recode函数进行数据编码rename函数重命名字段arrange排序数据列select筛选数据filter过滤数据