2014-06-10 9 views
12

Devo creare un nuovo frame di dati nDF che binarizza tutte le variabili categoriali e allo stesso tempo conserva tutte le altre variabili in un frame di dati DF. Ad esempio, ho le seguenti variabili di caratteristiche: RACE (4 tipi) e AGE e una variabile di uscita chiamata CLASS.Codifica One-Hot in [R] | Variabili categoriali a variabili fittizie

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 

voglio convertire questo in NDF con cinque (5) variabili o quattro (4) anche:

 
      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 

mi è familiare con il contrasto trattamento alla variabile DF $ RACE. Tuttavia, se a implementare

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

quello che ottengo è ancora un DF di tre variabili, ma con variabili DF $ RACE avere l'attributo "contrasti".

Quello che in definitiva voglio se è una nuova cornice dati NDF come illustrato in precedenza, ma che può essere molto noioso per valutare se uno ha circa 50 variabili includono, con più di cinque (5) dei quali sono variabili categoriali.

+0

Se si è aperti a usare [data.table] (https://github.com/Rdatatable/data.table), puoi usare il metodo one_hot() da [mltools] (https://github.com/ben519/mltools). – Ben

risposta

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 

La formula ~RACE-1 specifica che R deve creare variabili dummy dalla variabile RACE, ma sopprimere l'intercetta (in modo che ogni colonna indica se un'osservazione proviene da una categoria specificata); il valore predefinito, senza -1, consiste nel rendere la prima colonna un termine di intercettazione (tutti), omettendo la variabile dummy per il livello di base (primo livello del fattore) dalla matrice del modello.

Più in generale, si potrebbe desiderare qualcosa di simile

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

Nota che quando si dispone di più variabili categoriali si avrà a qualcosa di un po 'difficile se si desidera un set completo di variabili dummy per ciascuno di essi. Penserei allo cbind() insieme a matrici di modelli separati, ma penso che ci sia anche qualche trucco per fare tutto questo in una volta che ho dimenticato ...

+0

Proverò sicuramente questo suggerito qui ed esploreremo ancora con cbind(). Questo è veramente utile. Avrei votato la tua risposta se avessi avuto più reputazione. – EFL

+0

Non riesco a capire il significato di '~ RACE-1'? – kravi

+2

'RACE' dice di tradurre la variabile categoriale in variabili dummy in base ai contrasti del trattamento; '-1' dice di omettere il termine di intercettazione –