- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数字向量,我想为其计算一种累积和。我说“一种”是因为标准的 cumsum 基本上是 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 创建于 2020-04-27 (v0.3.0)
但是有没有一种方法可以避免 for 循环呢?我一直在努力想出一个办法,但就是想不出来。
如果相关,我的真实案例会将其应用于数据框。它将被分组,然后我将为每个组创建一个包含此累积总和的新列。但我对那部分很满意,只是想不出如何清理这个操作。
最佳答案
我们可以在base R
中使用Reduce
csum2 <- Reduce(function(u, v) max(u + v, v), x, accumulate = TRUE)
-检查OP的输出
identical(csum, csum2)
#[1] TRUE
或者另一种选择是 accumulate
from purrr
library(purrr)
accumulate(x, ~ max(.x + .y, .y))
关于r - 具有潜力的累计和 "resets",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61465136/
我对以下需要使用 SQL 查询而不是 plsql 来解决的问题感到困惑。这个想法是建立一个累积列来计算之前的所有月份。输入表看起来像 Month 1 2 3 .. 24 我需要建立下表:
我正在寻找一个整洁的解决方案,最好使用 tidyverse 这个问题符合this answer ,但它确实有一个额外的扭曲。我的数据有一个整体分组变量“grp”。在每个这样的组中,我想根据“试验”定义
我正在尝试在 Spotfire 中创建一个运行余额列,该列应该如下图所示。本质上,我想逐行计算“金额”列的累积总计,并且我希望它随着日期的变化从 0 开始。 我尝试过几个 OVER 函数:Sum([A
我是一名优秀的程序员,十分优秀!