web-dev-qa-db-fra.com

Encodage à chaud dans [R] | Variables catégoriques à factices

Je dois créer un nouveau bloc de données nDF qui binarise toutes les variables catégorielles et en même temps conserve toutes les autres variables dans un bloc de données DF . Par exemple, j'ai les variables de fonctionnalité suivantes: RACE (4 types) et AGE, et une variable de sortie appelée CLASS.

DF =

 ÂGE DE COURSE (EN DESSOUS DE 21) CLASSE 
 Cas 1 HISPANIC 0 A 
 Cas 2 ASIAN 1 A 
 Cas 3 HISPANIC 1 D 
 Cas 4 CAUCASIAN 1 B 

Je veux le convertir en nDF avec cinq (5) variables ou quatre (4) même:

 RACE.1 RACE.2 RACE.3 AGE (CI-DESSOUS 21) CLASSE 
 Cas 1 0 0 0 0 A 
 Cas 2 0 0 1 1 A 
 Cas 3 0 0 0 1 D 
 Cas 4 0 1 0 1 B 

Je connais le contraste du traitement avec la variable DF $ RACE. Cependant, si je mets en œuvre

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

ce que j'obtiens est toujours un DF de trois variables, mais avec une variable DF $ RACE ayant l'attribut "contrastes".

Ce que je veux en fin de compte, c'est un nouveau bloc de données nDF comme illustré ci-dessus, mais qui peut être très fastidieux pour évaluer si l'on a environ 50 variables de caractéristiques, avec plus de cinq (5) d'entre elles étant des variables catégorielles .

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

La formule ~RACE-1 Spécifie que R doit créer des variables factices à partir de la variable RACE, mais supprime l'interception (de sorte que chaque colonne représente si une observation provient d'une catégorie spécifiée); la valeur par défaut, sans -1, est de faire de la première colonne un terme d'interception (tous les uns), en omettant la variable fictive pour le niveau de base (premier niveau du facteur) de la matrice du modèle.

Plus généralement, vous voudrez peut-être quelque chose comme

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

Notez que lorsque vous avez plusieurs variables catégorielles, vous devrez quelque chose d'un peu délicat si vous voulez des ensembles complets de variables factices pour chacune. Je penserais à cbind() ing ensemble des matrices de modèles séparés, mais je pense qu'il y a aussi une astuce pour faire tout cela à la fois que j'oublie ...

28
Ben Bolker