使用for循环附加到r中的空对象

时间:2014-08-10 22:21:25

标签: r for-loop

这似乎是一个新手问题,但我很难理解为什么这不起作用。

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。

2 个答案:

答案 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

}

相关问题