2013-10-16 15 views
9

以下のコードでは、単一のプレディクタでK最近隣を使用しようとしています。 test.Xの例の数と一致するように、train.Xの例の数は必要ありませんが、Rは正しく入力を解析していないようです。RのK最近隣の次のディメンションの不一致をどのように解決できますか?

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) 

上記のコードが実行されると、それはRはそれらを正しく解析するように、私はtrain.Xtest.Xを修正するにはどうすればよい

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

エラーを取得?

答えて

13

knn関数は、列車とテストセットの引数として行列またはデータフレームを取ります。あなたはベクトルとして渡されていますが、これは行列として解釈されますが、あなたの望むやり方ではありません。具体的には、渡すデータは、フィーチャを示す異なる値を持つ単一のデータポイントとして解釈されます。これは、列車とテストの機能の数が異なることを意味しています。

修正するには、明示的に変換するだけです(例:

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

この解決策は機能しますが、Rが私が望む方法でベクトルを解釈する唯一の方法ですか? 特に、私はベクトルを転置しようとしましたが、長さ不一致のエラーメッセージが出ます。 – merlin2011

+0

明示的に適切な次元の行列に変換することもできます。 –

+0

その構文は何ですか? – merlin2011

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" 
関連する問題