一次累加和减去时有条件的累加重置

时间:2020-05-14 02:44:00

标签: r cumsum

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

import React, { Component, Fragment } from "react";

class Footer extends Component {
  render() {
    return (
      <div style={{ position: "absolute", bottom: 0, width:"100%" }} className="bg-gray-100">
        <div className="bg-gray-100 container mx-auto px-6 pt-10 pb-6">
          > © Oracle Corp. All rights reserved.
        </div>
      </div>
    );
  }
}

export default Footer;

我使用下面给出的代码应用了条件求和:

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)

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

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

我搜索了类似的问题,但是无法获得解决问题的答案。这些是我尝试解决问题的一些链接:

Conditional cumsum with reset

resetting cumsum if value goes to negative in r

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

1 个答案:

答案 0 :(得分:1)

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

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