在R中循环计算列绝对差值时AbsError结果异常的问题排查
问题分析与解决方案
嘿,我来帮你理清这个问题的根源!你的循环能正确生成Forecast值,但AbsError列全是同一个数,核心原因出在赋值时没有指定行索引。
问题所在
看你循环里的这行代码:
new.phone$AbsError <- abs((new.phone$Subscribers[i] - new.phone$Forecast[i]))
这里你没有给AbsError加上行索引[i],意味着每次循环都会把整个AbsError列全部替换成当前第i行的差值结果。等循环跑完,整个列就只剩下最后一次循环(也就是最后一行)计算出来的差值,所以所有值都一模一样。
修正后的循环代码
只需要给AbsError加上行索引[i],就能逐行赋值了:
for (i in 1:nrow(new.phone)) { new.phone$Forecast[i] <- ((1.828e+07 )*new.phone$Year[i]) + (-3.666e+10) # 加上[i],只修改当前行的AbsError new.phone$AbsError[i] <- abs(new.phone$Subscribers[i] - new.phone$Forecast[i]) }
更高效的R风格写法
其实在R里,我们完全不需要用循环来做这种列运算——R天生擅长向量化操作,代码更简洁,运行效率也更高:
# 一次性计算整个Forecast列 new.phone$Forecast <- (1.828e+07 * new.phone$Year) - 3.666e+10 # 一次性计算整个AbsError列 new.phone$AbsError <- abs(new.phone$Subscribers - new.phone$Forecast)
这种写法不仅避免了循环里的索引错误,还更符合R的编程习惯哦。
内容的提问来源于stack exchange,提问作者Ashley
相关产品推荐
相关产品推荐

