R语言如何不使用for循环获取向量的历史最大值对应的位置索引
R语言无循环获取历史最大值位置的实现方案
最简实现
直接使用R内置的cummax(累计最大值)函数配合which即可一行完成需求:
vector <- c(3, 2,2,3,4,3,9,5,2,3,4,6,120,1) result <- which(vector == cummax(vector))
运行后result的输出为[1] 1 5 7 13,和你示例需要的结果完全一致。
实现逻辑
cummax函数会按顺序返回向量每个位置对应的历史最大值,当且仅当当前位置的元素是新的历史最大值时,该位置的元素值才会等于cummax返回的累计最大值,用which提取符合条件的索引即可。
可选实现(基于差值判断)
如果你需要单独识别新最大值出现的节点,也可以结合diff函数实现:
result <- c(1, which(diff(cummax(vector)) > 0) + 1)
该方法通过计算累计最大值的差值,筛选出差值大于0的位置(即出现新最大值的位置),补全索引偏移后再加上第一个位置的1,输出结果和上述方法完全一致。
注意事项
你原有for循环代码中使用max作为变量名属于不规范写法,max是R内置函数名,用作变量名容易引发命名冲突,建议替换为current_max这类自定义名称。
内容的提问来源于stack exchange,提问作者Alejandro Molina Moctezuma
相关产品推荐
相关产品推荐

