R语言For循环索引异常:滑动窗口取值不符合预期原因咨询
问题原因解析
核心问题出在R的运算符优先级规则上,这和你熟悉的Python逻辑不一样:
- R中,序列运算符
:的优先级高于加法+,所以你写的i:167+i会被R解析成(i:167) + i,而不是你预期的i:(167+i)。 - 这意味着代码会先生成从
i到167的序列,再给序列里的每个数值加上i,最终得到的索引范围完全偏离了滑动窗口的要求。
具体拆解错误代码
当i=1时:(1:167)+1会生成2,3,...,168的序列,对应取数据集的第2到168条——你说第一次循环正常打印前168条,可能是对窗口长度的描述或代码写法有小误差,但核心逻辑是优先级导致的解析错误。
当i=2时:(2:167)+2生成4,5,...,169的序列,对应取第4到169条,这就是你看到的结果偏离预期的原因。
为什么第二个代码符合预期
第二个代码df[i:168]里,i:168是直接生成从i到168的序列,没有混合优先级更高的运算符,所以每次循环起始位置i递增1,结束位置固定为168,自然实现了“每次移除首条观测”的效果。
正确的滑动窗口写法
如果要实现每次窗口滑动一位(起始+1,结束+1,保持168条长度),需要给加法部分加括号,强制先计算结束位置:
for (i in 1:10) { print(df[i:(i+167)]) }
这样i:(i+167)会先算i+167,再生成从i到该值的序列,完美匹配你要的滑动窗口逻辑:
i=1→ 1:168(前168条)i=2→ 2:169(第2到169条)- 以此类推...
内容的提问来源于stack exchange,提问作者user20050294
相关产品推荐
相关产品推荐

