【发布时间】: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)
)
【问题讨论】:
标签: r dplyr accumulate