在R中一次累加和减时有条件的总和

问题描述 投票:0回答:1

我有一个带有三个变量的数据帧,即V1,V2和V3。

ts<- c(-2, 4, 3,-5,-5,-7, -8, -2, -3, -5,-7, -8, -9, -2, 1, 2,4)

x<- c(6, 0, 0 ,1, 0, 2, 3,5,7,7,8,2,0, 0, 0 , 0, 0)

y<- c(0, 5, 8, 0, 0 , 0 , 0 , 0 , 0, 0, 0, 0, 0, 7, 9, 12, 0)

ve <- data.frame(V1 = ts, V2 = x, V3 =y)

我使用下面给出的代码应用了条件累加:

ve$yt<- cumsum(ifelse(ve$V1>0, ve$V2-(ve$V3), ve$V2)) 

我必须承认,这段代码为我完成了部分工作,直到遇到负值。因此,我有不同的期望输出(DO)。一旦我在列[[yt中遇到负值,我想重新开始累积下表中所示的值。

View(Ve) V1 V2 V3 yt DO -2 6 0 6 6 4 0 5 1 1 3 0 8 -7 0 -5 1 0 -6 1 -5 0 0 -6 1 -7 2 0 -4 3 -8 3 0 -1 6 -2 5 0 4 11 -3 7 0 11 18 -5 7 0 18 25 -7 8 0 26 33 -8 2 0 28 35 -9 0 0 28 35 -2 0 7 28 35 1 0 9 19 26 2 0 12 7 14 4 0 0 7 14
我搜索了类似的问题,但无法获得解决问题的答案。这些是我尝试解决问题的一些链接:

Conditional cumsum with reset

resetting cumsum if value goes to negative in r

我真诚地要求帮助我解决问题。

谢谢你。

r rstudio cumsum
1个回答
0
投票
这里是您可以执行此操作的一种方法:

ve$DO <- Reduce(function(x,y) pmax(x + y, 0), with(ve, V2-V3*(V1 > 0)), accumulate = TRUE) ve V1 V2 V3 DO 1 -2 6 0 6 2 4 0 5 1 3 3 0 8 0 4 -5 1 0 1 5 -5 0 0 1 6 -7 2 0 3 7 -8 3 0 6 8 -2 5 0 11 9 -3 7 0 18 10 -5 7 0 25 11 -7 8 0 33 12 -8 2 0 35 13 -9 0 0 35 14 -2 0 7 35 15 1 0 9 26 16 2 0 12 14 17 4 0 0 14

© www.soinside.com 2019 - 2024. All rights reserved.