2014-06-10 5 views
12

Ich muss einen neuen Datenrahmen erstellen nDF, die alle kategorischen Variablen binarisiert und gleichzeitig alle anderen Variablen in einem Datenrahmen DF behält. Zum Beispiel habe ich die folgenden Feature-Variablen: RACE (4 Typen) und AGE, und eine Ausgabevariable namens CLASS.One-Hot-Codierung in [R] | Kategorische Dummy-Variablen

DF =

 
       RACE  AGE (BELOW 21)  CLASS 
Case 1 HISPANIC     0   A 
Case 2  ASIAN     1   A 
Case 3 HISPANIC     1   D 
Case 4 CAUCASIAN     1   B 

Ich möchte dies mit fünf (5) Variablen in NDF konvertieren oder vier (4) selbst:

 
      RACE.1 RACE.2 RACE.3  AGE (BELOW 21)  CLASS 
Case 1   0   0   0     0   A 
Case 2   0   0   1     1   A 
Case 3   0   0   0     1   D 
Case 4   0   1   0     1   B 

Ich bin vertraut mit der Behandlung Gegensatz zu den variablen DF $ RENNEN. wenn ich jedoch implementieren

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

was bekomme ich noch ein DF von drei Variablen, aber mit variabler DF $ RACE das Attribut „Kontraste“.

Was ich letztendlich möchte, ist ein neuer Datenrahmen nDF wie oben dargestellt, aber die Auswertung kann sehr langweilig sein, wenn man etwa 50 Merkmalsvariablen hat, wobei mehr als fünf (5) kategorische Variablen sind.

+0

Wenn Sie offen für die Verwendung der [data.table] (https://github.com/Rdatatable/data.table) Paket können Sie die one_hot() -Methode von [mltools] (https://github.com/ben519/mltools) verwenden. – Ben

Antwort

24
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 

Die Formel gibt an, daß R ~RACE-1 Dummy-Variablen aus den Variablen RACE erzeugen soll, aber das Intercept unterdrücken (so dass jede Spalte stellt dar, ob eine Beobachtung aus einer bestimmten Kategorie stammt); Der Standard, ohne -1, besteht darin, die erste Spalte zu einem Schnittpunktbegriff (alle Einsen) zu machen, wobei die Dummy-Variable für die Basislinienebene (erste Ebene des Faktors) aus der Modellmatrix weggelassen wird.

Allgemeiner gesagt, möchten Sie vielleicht so etwas wie

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

Beachten Sie, dass, wenn Sie mehrere kategorische Variablen haben, werden Sie etwas ein wenig kompliziert, wenn Sie für jede vollständige Sätze von Dummy-Variablen wollen. Ich denke an cbind() zusammen separate Modellmatrizen, aber ich denke, es gibt auch einen Trick, dies auf einmal zu tun, dass ich vergesse ...

+0

Ich werde auf jeden Fall diesen hier vorgeschlagenen ausprobieren und weitere mit cbind() erkunden. Das ist wirklich hilfreich. Ich hätte Ihre Antwort gewählt, wenn ich mehr Reputation zählen würde. – EFL

+0

Ich bin nicht in der Lage, die Bedeutung von ~ ~ RACE-1 zu verstehen? – kravi

+2

'RACE' sagt, dass die kategoriale Variable nach Behandlungskontrasten in Dummy-Variablen übersetzt werden soll; '-1' sagt, dass der Intercept-Ausdruck –

Verwandte Themen