带可变上限的有界累积求和(cumsum)实现需求
实现可变上限的有界累积求和
针对需求:实现类似cumsum()的有界累积求和,结果不低于固定下限0,且不高于对应位置的可变上限(来自upper_bound列),以下提供两种可行实现方式:
基础R循环实现
无需额外依赖包,通过循环逐次计算并约束上下限:
test_data <- tibble(prec_et = c(1,2,-1,-3,5,4,5,4,3,-3,-2,4,3,4), upper_bound = c(10,10,10,10,10,10,10,13,14,15,16,17,18,19)) result <- numeric(nrow(test_data)) current_sum <- 0 for (i in seq_along(test_data$prec_et)) { current_sum <- current_sum + test_data$prec_et[i] # 约束结果在[0, 当前upper_bound]区间内 current_sum <- max(0, min(current_sum, test_data$upper_bound[i])) result[i] <- current_sum } result # 输出:[1] 1 3 2 0 5 9 10 13 14 11 9 13 16 19
tidyverse 简洁实现
利用purrr::accumulate2处理双序列依赖的累积计算:
library(tidyverse) test_data <- tibble(prec_et = c(1,2,-1,-3,5,4,5,4,3,-3,-2,4,3,4), upper_bound = c(10,10,10,10,10,10,10,13,14,15,16,17,18,19)) test_data %>% mutate(cumsum_bounded = accumulate2(prec_et, upper_bound, .init = 0, ~ { new_sum = .x + .y[[1]] max(0, min(new_sum, .y[[2]])) }) %>% tail(-1))
执行后cumsum_bounded列即为符合要求的有界累积求和结果,与期望输出一致。
内容的提问来源于stack exchange,提问作者Mogens
相关产品推荐
相关产品推荐

