2016-06-14 11 views
-1

私は初心者です。私はhereから取られたデータセットを持っています。このデータセットは、異なる属性を持つ人物プロファイルで構成されていますが、professionはそれらのものです。管理職、ブルーカラー、起業家、家事、経営、退職、自営業、サービス、学生、技術者、失業者、未知の12の職種があります。1文字列から新しい数値列を作成

私はこのデータセットにK-NNを適用したいので、職業欄を12の新しい欄に分けて、1を対応する専門職に、0を他の11専門職その人に属していない。

私はforeach packagefor loopsを試しましたが、失敗しました。私はforeachで動作することができないんだ、と私は、次のコードから、次に何をすべきか分からない:

jobs <- data[,2] 
jobs 
for (job in jobs) { 
    print(job) 
    #No idea how to create the new columns here, based on if conditionals 
} 

はどのようにこれを行うための最善の方法だろうか?

ありがとうございました。


+0

データの再現可能なサンプルを追加できますか?(質問ではなくリンクから直接アクセスできます) –

+0

何をしようとしているのか正確には分かりませんが、Rの 'factor'関数を見てください。 – Marsenau

+0

@BryanGogginデータのサンプルはどういう意味ですか? .csvをここにコピーして貼り付けますか? –

答えて

0

あなたは確かにforループを使用して問題を解決することができますが、私は長期的には、より効率的なソリューション提案することができる:reshape2パッケージ(https://cran.r-project.org/web/packages/reshape2/を)。

私はbank-full.csvのデータをオブジェクト銀行のRに読み込んでいます。次reshape2パッケージには、ダウンロード、インストール、およびロードする必要があります。データは、その後の観測が列上の行との仕事上にあるフォーマットに成形することができる

install.packages("reshape2") 
library(reshape2) 

。そして、

bank$id<-1:nrow(bank) 

データフレームbankから列2および18(ジョブとID)を取得し、前述の形態にそれらを鋳造するように行うことができる:アクセサリーid列がデータに最初に追加され

tmp<-dcast(bank[,c(2, 18)], id~job, length) 

新しいデータフレームtmpが必要です。各ジョブには独自の列があります。すべてのIDはデータ内に1回しか存在しないため、dcast関数で使用される関数lengthは、データを集約する関数では、すべての列にちょうど0と1が入ります。

最後に、これらの新しい列は、元のデータセットに追加することができます。角括弧内の

bank<-cbind(bank[,-18], tmp[,-1]) 

負の添字は、データセットから列を削除するので、これは同時に、あなたがid列をオフに取り除くましょう。

bank2<-cbind(bank, model.matrix(~ 0 + job, bank)) 

これはあなたに新しい列として各ジョブのデータフレームを与える必要があります:


もう一つ、これを行うには、より効率的な方法は、関数model.matrixを使用することです。ただし、列名は少し変更されます(ジョブ列の先頭にジョブが追加されます)。

+0

ありがとう、両方の方法は、実際に働いた!今私はジョブの列を削除し、他の列の文字列の値を数値のものに変更するだけです。 (-1,0,1など)。 しかし、上記のコードでは、最後の最も効率的なものですが、私はそれの構文を理解していませんでした。説明できますか? cbindは何を正確に行い、model.matrixとその引数は何ですか? –

+0

関数 'model.matrix'は、R因子(「カテゴリ変数」)を線形モデル(回帰)で使用できるモデル行列に変換します。それは、モデル行列がどのように構築されるかを示す式を引数として取ります。この例の式は、行列(項0、1で満たされた列)からインターセプト項を削除し、次にジョブ係数のレベルを個々の列に再コードします。 '?model.matrix'と'?formula'のRヘルプを読んでみてください。関数cbindは、2つのオブジェクトの列を結合して新しいオブジェクトを作成します。 –

+0

'model.matrix'が' head(model.matrix(〜0 + job、bank)) 'のように実行するだけで' model.matrix'が行うことをテストできます。結果として得られるオブジェクトの最初の行がいくつか表示されます。 –

関連する問題