web-dev-qa-db-ja.com

[R]でのワンホットエンコーディング|カテゴリー変数からダミー変数へ

新しいデータフレームを作成する必要がありますnDFすべてのカテゴリ変数を2値化し、同時にデータフレーム内の他のすべての変数を保持します[〜#〜] df [〜#〜]。たとえば、私は次の機能変数を持っています:RACE(4タイプ)とAGE、およびCLASSと呼ばれる出力変数。

DF =

レース年齢(21歳未満)クラス
ケース1ヒスパニック0 A 
ケース2 ASIAN 1 A 
ケース3ヒスパニック1 D 
ケース4 CAUCASIAN 1 B 

これを5つの変数または4つの変数を持つnDFに変換したいと思います。

 RACE.1 RACE.2 RACE.3年齢(21歳未満)クラス
ケース1 0 0 0 0 A 
ケース2 0 0 1 1 A 
ケース3 0 0 0 1 D 
ケース4 0 1 0 1 B 

変数[〜#〜] df [〜#〜] $ RACEと対照的な扱いに精通しています。ただし、実装すると

contrasts(DF$RACE) = contr.treatment(4)

私が得るものは、3つの変数の[〜#〜] df [〜#〜]ですが、変数[〜#〜] df [〜#〜] $ 「コントラスト」という属性を持つRACE。

私が最終的に欲しいのは新しいデータフレームnDFは上に示したとおりですが、5つ以上のカテゴリ変数で5つ以上の特徴変数があるかどうかを評価するのは非常に退屈な場合があります。

20
EFL
_dd <- read.table(text="
   RACE        AGE.BELOW.21     CLASS
   HISPANIC          0          A
   ASIAN             1          A
   HISPANIC          1          D
   CAUCASIAN         1          B",
  header=TRUE)


  with(dd,
       data.frame(model.matrix(~RACE-1,dd),
                  AGE.BELOW.21,CLASS))
 ##   RACEASIAN RACECAUCASIAN RACEHISPANIC AGE.BELOW.21 CLASS
 ## 1         0             0            1            0     A
 ## 2         1             0            0            1     A
 ## 3         0             0            1            1     D
 ## 4         0             1            0            1     B
_

式_~RACE-1_は、RがRACE変数からダミー変数を作成することを指定しますが、切片を抑制します(そのため、各列は観測が指定されたカテゴリからのものかどうかを表します)。 _-1_なしのデフォルトでは、最初の列を切片項(すべて1)にし、モデルマトリックスからベースラインレベル(因子の最初のレベル)のダミー変数を省略します。

より一般的には、次のようなものが必要になる場合があります

_ dd0 <- subset(dd,select=-CLASS)
 data.frame(model.matrix(~.-1,dd0),CLASS=dd$CLASS)
_

複数のカテゴリー変数がある場合、それぞれに完全なダミー変数のセットが必要な場合は、少し注意が必要になることに注意してください。私は別々のモデル行列を一緒にcbind() ingすることを考えますが、これを一度にすべて行うためのいくつかのトリックが私が忘れていると思います...

28
Ben Bolker