r - 一次累加和减法时重置的条件累加

标签 r cumsum

我有一个包含三个变量的数据框,即 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

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

最佳答案

这是您可以执行此操作的一种方法:

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

相当于使用purrr/dplyr:

library(purrr)
library(dplyr)

ve %>%
  mutate(DO = accumulate(V2-V3*(V1 >  0), .f = ~pmax(.x + .y, 0)))

关于r - 一次累加和减法时重置的条件累加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61788403/

相关文章:

css - 定位 R Shiny 的 selectInput 小部件

R cumsum 与 if 条件

r - 计算级别内的值

r - 使用 R 从数据帧获取数据到 MS-access DB 目标表

python - Numpy 一维数组 CumSquare 值

python - Pyspark:有条件的窗口/累积和

arrays - 算法:给定一个数字数组 A,创建一个数组 B,其中 B[i] = sum(A[j]: A[j] <= A[i])

python - Pandas 的数量超过群体

r - 当有多个数据点时复制信息

linux - 如何使用/dev/stdin 和 read.csv() 从终端读取输入?