这似乎是一个新手问题,但我很难理解为什么这不起作用。
answer = c()
for(i in 1:8){
answer = c()
knn.pred <- knn(data.frame(train_week$Lag2), data.frame(test_week$Lag2), train_week$Direction, k=i)
test <- mean(knn.pred == test_week$Direction)
append(answer, test)
}
我希望结果1-8在一个名为answer的向量中。它应该循环8次,所以理想情况下,一个带有8个数字的向量将是我的输出。当我运行for循环时,我只得到最终答案,这意味着它不会附加。任何帮助将不胜感激,抱歉新手问题,真的想学习R。
答案 0 :(得分:1)
你在for循环中覆盖answer
。尝试删除该行。另外,追加并不直接对其论点采取行动;它返回修改后的矢量。所以你需要分配它。
answer <- c()
for(i in 1:8){
knn.pred <- knn(data.frame(train_week$Lag2), data.frame(test_week$Lag2), train_week$Direction, k=i)
test <- mean(knn.pred == test_week$Direction)
answer <- append(answer, test)
}
答案 1 :(得分:1)
首先,请在下次问题中添加可重现的示例。请参阅How to make a great R reproducible example?。
其次,在循环的第一行中将answer
设置为c()
,因此每次迭代都会发生这种情况。
第三,append
,就像R中的几乎所有函数一样,不会修改其参数,但会返回一个新对象。所以正确的代码是:
answer = c()
for (i in 1:8){
knn.pred <- knn(data.frame(train_week$Lag2), data.frame(test_week$Lag2),
train_week$Direction, k = i)
test <- mean(knn.pred == test_week$Direction)
answer <- append(answer, test)
}
虽然这不是问题,但我不禁注意到这是创建矢量和列表的一种非常低效的方法。这是一种反模式。如果知道结果向量的长度,则分配它,并设置其元素。 E.g
answer = numeric(8)
for (i in 1:8){
knn.pred <- knn(data.frame(train_week$Lag2), data.frame(test_week$Lag2),
train_week$Direction, k = i)
test <- mean(knn.pred == test_week$Direction)
answer[i] <- test
}