r - 具有潜在“重置”的累积和
问题描述
我有一个数字向量,我想为其计算一种累积和。我说“一种”是因为标准的 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 包(v0.3.0)于 2020-04-27 创建
但是有没有办法避免for循环呢?我一直在努力想一个,但就是想不出来。
如果相关,我的真实案例会将其应用于数据框。它将被分组,然后我将为每个组创建一个包含此累积总和的新列。但我对那部分很满意,我只是不知道如何清理这个操作。
解决方案
我们可以用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))
推荐阅读
- reactjs - 通过 Provider 将自定义 props 传递给每个样式化的组件
- r - R:在函数中指定输出保存名称
- c# - System.Reactive.Concurrency.DefaultScheduler 是否依赖于 Windows 任务计划程序?
- mysql - 获取 24 小时时间范围内的记录
- jmeter - jMeter忽略线程组
- flutter - 在 Flutter 中使用特定于平台的包
- r - 根据具有有效值的行数从数据框中删除列
- google-cloud-platform - GCP:如何在控制台或 Spanner 的后端查看插入、更新和删除语句的统计信息
- tabula-py - Tabula 字体警告导致无法从文档中解析表格。这是它应该如何工作的吗?
- spring - 为什么 spring cglib 增强的子类不能扩展父受保护的属性?