在R中从零实现向量每10元素分区间找最大值的所有索引
R基础循环代码错误排查:区间最大值索引提取
需求明确
给定向量:
vect_1 = c(2,3,5,10,1,9,4,7,6,8,21,13,51,14,11,91,91,17,16,28)
要求:
- 按每10个元素拆成区间(共2个:1-10位、11-20位)
- 找出每个区间里最大值对应的所有索引(多个最大值全保留)
- 只能用基础运算符和循环,不能用
%in%或其他高级函数
你的代码输出是[1] 1 2 3 4 1 3 6 7,和期望的[1] 4 6 7(推测你要的是区间内相对索引,若要原始向量索引则是4、16、17)不符,问题出在这几个地方:
错误原因拆解
- 最大值判断逻辑错误:你应该先找出整个区间的最终最大值,再去匹配对应索引,而不是遍历过程中把所有比之前值大的元素索引都存下来——这会导致把中间过程的较大值索引也纳入,比如第一个区间里2→3→5→10,你错误地把1、2、3、4都存了进去。
- 索引类型混淆:错误输出里的1、2、3是区间内的相对位置,若需求是原始向量索引则完全不符合;就算要相对索引,你的逻辑也错在提前存入了非最大值的位置。
- 区间边界处理混乱:未准确划分每个区间的起始、结束位置,导致循环范围覆盖错误。
修正后的代码
情况1:提取区间内相对索引(匹配你的期望输出)
vect_1 = c(2,3,5,10,1,9,4,7,6,8,21,13,51,14,11,91,91,17,16,28) max_value_idx = c() # 计算完整的10元素区间数量 interval_count = length(vect_1) %/% 10 for (i in 1:interval_count) { # 确定当前区间在原始向量中的起止位置 start = (i - 1)*10 + 1 end = i*10 sub_vect = vect_1[start:end] # 第一步:找出当前区间的最大值 current_max = sub_vect[1] for (j in 2:length(sub_vect)) { if (sub_vect[j] > current_max) { current_max = sub_vect[j] } } # 第二步:遍历区间,收集所有等于最大值的相对索引 for (j in 1:length(sub_vect)) { if (sub_vect[j] == current_max) { max_value_idx = c(max_value_idx, j) } } } max_value_idx
运行结果:
[1] 4 6 7
情况2:提取原始向量索引(更常用的实际需求)
如果需要的是原始向量中的索引,只需修改收集索引的代码行:
# 将原收集行 max_value_idx = c(max_value_idx, j) # 替换为 max_value_idx = c(max_value_idx, start + j - 1)
运行结果:
[1] 4 16 17
关键修正点
- 分两步处理:先遍历区间确定最终最大值,再二次遍历匹配所有对应索引,避免存入中间值的索引
- 明确区分区间相对索引与原始向量索引,按需计算
- 用
(i-1)*10 +1和i*10准确划分区间边界,确保每个区间都是10个元素
内容的提问来源于stack exchange,提问作者user20253433
相关产品推荐
相关产品推荐

