具有潜在“残基”的累积总和

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

我有一个数值向量,我想为其计算某种累计和。我之所以说“一种”,是因为标准的累积金额基本上是cumsum[i] = cumsum[i-1] + x[i]。但是,在这种情况下,我需要使用cumsum[i] = max(cumsum[i-1] + x[i], x[i])

即,如果最新元素的值大于累积和(例如,如果以前有负值,则可能会发生这种情况,那么只需采用最新元素。

显然,这可以通过简单的for循环手动完成:

set.seed(1)
x <- runif(10, min = -1, max = 1)
csum <- rep(0, 10)
for(i in seq_along(x)) {
  if (i == 1) csum[i] <- x[i]

  csum[i] <- max(csum[i-1] + x[i], x[i])
}
x; csum
#>  [1] -0.4689827 -0.2557522  0.1457067  0.8164156 -0.5966361  0.7967794
#>  [7]  0.8893505  0.3215956  0.2582281 -0.8764275
#>  [1] -0.4689827 -0.2557522  0.1457067  0.9621223  0.3654862  1.1622655
#>  [7]  2.0516161  2.3732117  2.6314397  1.7550123

reprex package(v0.3.0)在2020-04-27创建

但是有没有一种方法可以避免for循环?我一直在想着一个问题,但一直做不到。

[如果相关,我的实际情况会将其应用于数据框。它将被分组,然后我将为每个组创建一个具有此累加总和的新列。但是我对这部分感到满意​​,只是不知道如何清理此操作。

r for-loop cumsum
1个回答
2
投票

我们可以在Reduce中使用base R

csum2 <- Reduce(function(u, v) max(u + v, v), x, accumulate = TRUE)

-检查OP的输出

identical(csum, csum2)
#[1] TRUE

或者另一个选择是accumulate中的purrr

library(purrr)
accumulate(x, ~  max(.x + .y, .y))
© www.soinside.com 2019 - 2024. All rights reserved.