如何在 R 中使用 dplyr mutate 函数计算 运行 余额?
How to use dplyr mutate function in R to calculate a running balance?
在底部的 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)
)
使用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
在底部的 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)
)
使用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