如何解决与R的最近邻居的以下维度不匹配?

时间:2013-10-16 06:52:56

标签: r

在下面的代码中,我试图使用K个最近邻居和一个预测器。 据我所知,train.X中的示例数量不需要与test.X中的示例数相匹配,但R似乎无法正确解析我的输入。< / p>

library(ISLR)
library(class)

train=(Weekly$Year<2009)
train.X = Weekly$Lag2[train]
test.X = Weekly$Lag2[!train]
train.Direction = Weekly$Direction[train]
knn.pred = knn(train.X, test.X, train.Direction, k=1)

运行上面的代码时,会出现错误

   Error in knn(train.X, test.X, train.Direction, k = 1) :   
      dims of 'test' and 'train' differ                       

如何修复train.Xtest.X以便R正确解析它们?

2 个答案:

答案 0 :(得分:14)

knn函数将矩阵或数据帧作为训练集和测试集的参数。你传入一个向量,它被解释为一个矩阵,但不是你想要的方式。具体而言,您传入的数据被解释为单个数据点,其中不同的值表示要素。这意味着列车和测试的功能数量不同,正如错误消息所示。

要修复,只需明确转换,例如

knn.pred = knn(data.frame(train.X), data.frame(test.X), train.Direction, k=1)

答案 1 :(得分:3)

这是因为在对矩阵,数组或数据帧进行子集化时,R会自动尝试强制使用最少的维数。为了防止丢弃数据帧的维度,您可以使用默认为drop=FALSE的子集函数。

train.X <- subset(Weekly[train],select="Lag2")

您还可以使用逻辑表达式作为参数来指示要保留的行或元素:

train.X <- subset(Weekly,Year<2009,select="Lag2")

子集函数还保持列名完整,让您使用train.X$Lag2作为有效列。使用另一个答案中建议的data.frame或as.data.frame将会错过原始名称信息。

> names(train.X)
[1] "Lag2"