R语言 两条件累积和

bfrts1fy  于 2023-04-18  发布在  其他
关注(0)|答案(3)|浏览(125)

给出的数据都是虚构的,现实中要复杂得多

t <- data.frame(v1=c(265, -268, 123, 58, 560, 56, -260, 40, 530, -895, 20))

我想用两个极限值来计算累积和:0和500。如果累计总额超过500,则必须保留500。如果累计总额变为负数,则必须存储0。获得的结果如下:

v1 sum.c
1   265   265
2  -268     0
3   123   123
4    58   181
5   560   500
6    56   500
7  -260   240
8    40   280
9   530   500
10 -895     0
11   20    20

Excel中的公式如下所示:=如果(B1+A2〈0;0;如果(B1+A2〉500;500; B1+A2))
有什么想法吗

vulvrdjw

vulvrdjw1#

我们可以使用minmax来设置边界,使用Reduce来迭代向量

> v1 <- c(265, -268, 123, 58, 560, 56, -260, 40, 530, -895, 20)

> Reduce(function(x, y) min(max(x + y, 0), 500),v1, accumulate = TRUE)
 [1] 265   0 123 181 500 500 240 280 500   0  20
eit6fx6z

eit6fx6z2#

从@ThomasIsCoding的想法,这里是tidyverse方法:

library(dplyr)
library(purrr)

t %>%
  mutate(sum.c = accumulate(v1, ~ min(max(.x + .y, 0), 500)))

     v1 sum.c
1   265   265
2  -268     0
3   123   123
4    58   181
5   560   500
6    56   500
7  -260   240
8    40   280
9   530   500
10 -895     0
11   20    20
qc6wkl3g

qc6wkl3g3#

使用Rcpp(来自here的基本代码):

library(Rcpp)
cppFunction('NumericVector cumsumCPP(NumericVector x){

    // Need to do this in order to avoid modifying the original x
    int n = x.size();
    NumericVector res(n);
    res[0] = x[0];

    for (int i = 1 ; i < n ; i++) {
      res[i] = res[i - 1] + x[i];
      if (res[i] > 500) { 
        res[i] = 500;
      }
      if (res[i] < 0) {
        res[i] = 0;
      }
    }

    return res;
}')

cumsumCPP(t$v1)
[1] 265   0 123 181 500 500 240 280 500   0  20

library(dplyr)
t%>%mutate(cum_s=cumsumCPP(v1))

     v1 cum_s
1   265   265
2  -268     0
3   123   123
4    58   181
5   560   500
6    56   500
7  -260   240
8    40   280
9   530   500
10 -895     0
11   20    20

您也可以在R中定义自己的自定义累计和。

相关问题