如何对向量(如cumsum)进行累计和,但是有界以使求和永远不会低于下限或上限?

标准的cumsum函数将导致以下结果。

foo <- c(100, -200, 400, 200)
cumsum(foo)
# [1]  100 -100  300  500

我正在寻找与基本cumsum函数一样高效的东西。我希望输出看起来像下面的样子。
cumsum.bounded(foo, lower.bound = 0, upper.bound = 500)
# [1]  100  0  400  500

谢谢

最佳答案

如评论中所述,Rcpp是一个不错的方法。
cumsumBounded.cpp:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector cumsumBounded(NumericVector x, double low, double high) {
  NumericVector res(x.size());
  double acc = 0;
  for (int i=0; i < x.size(); ++i) {
    acc += x[i];
    if (acc < low)  acc = low;
    else if (acc > high)  acc = high;
    res[i] = acc;
  }
  return res;
}

编译并使用新功能:
library(Rcpp)
sourceCpp(file="cumsumBounded.cpp")
foo <- c(100, -200, 400, 200)
cumsumBounded(foo, 0, 500)
# [1] 100   0 400 500

关于r - 有界累计总和?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21262424/

10-12 20:01