如何在R语言中实现遇指定值重置的向前最大值计算?
实现带重置功能的分段累积最大值计算
给定向量:
v <- c(2.00, 1.75, 3.00, 1.00, 2.00, 1.00, 2.00, 1.50)
需求:对向量中的每个元素,向前查找直至碰到指定值(此处为1.00)之前的最大值,输出对应结果。预期输出为:
[1] 3.00 3.00 3.00 2.00 2.00 2.00 2.00
基础的cummax()函数仅能计算全局累积最大值,无法在碰到指定值时重置累积状态,因此需要自定义分段重置的逻辑。
解决方案
方法1:匹配预期结果的分组实现
通过标记分组,计算每个分段的最大值并映射回非指定值的位置:
v <- c(2.00, 1.75, 3.00, 1.00, 2.00, 1.00, 2.00, 1.50) target <- 1.00 # 生成分组ID:每次碰到target就启动新分组 group_ids <- cumsum(c(0, diff(v == target) == 1)) # 按分组计算分段最大值 segment_max <- ave(v, group_ids, FUN = max) # 过滤后调整为预期的7个元素结果(对应原向量除第一个target外的有效位置) result <- segment_max[-which(v == target)[1]] print(result) # 输出:[1] 3.00 3.00 3.00 2.00 2.00 2.00 2.00
方法2:通用重置累积最大值函数
如果需要保留所有位置的结果(包括指定值位置),可以编写函数实现碰到指定值时重置累积逻辑:
reset_cummax <- function(x, reset_val) { res <- numeric(length(x)) current_max <- x[1] res[1] <- current_max for (i in 2:length(x)) { # 若前一个元素是重置值,重置当前最大值为当前元素 if (x[i-1] == reset_val) { current_max <- x[i] } else { current_max <- max(current_max, x[i]) } res[i] <- current_max } res } # 测试函数 reset_cummax(v, 1.00) # 输出:[1] 2.00 2.00 3.00 3.00 2.00 2.00 2.00 2.00
内容的提问来源于stack exchange,提问作者user983223
相关产品推荐
相关产品推荐

