hot - dummyvars
Codificación One-Hot en[R] | Categóricas a variables ficticias (1)
Esta pregunta ya tiene una respuesta aquí:
Necesito crear un nuevo marco de datos nDF que binarice todas las variables categóricas y al mismo tiempo retenga todas las demás variables en un marco de datos DF . Por ejemplo, tengo las siguientes variables de función: RACE (4 tipos) y AGE, y una variable de salida llamada CLASS.
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
Quiero convertir esto en nDF con cinco (5) variables o cuatro (4) incluso:
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
Estoy familiarizado con el contraste del tratamiento con la variable DF $ RACE. Sin embargo, si implemento
contrasts(DF$RACE) = contr.treatment(4)
Lo que obtengo es todavía un DF de tres variables, pero con la variable DF $ RACE que tiene el atributo "contrastes".
Sin embargo, lo que en última instancia quiero es un nuevo marco de datos nDF como se ilustra arriba, pero puede ser muy tedioso evaluar si uno tiene alrededor de 50 variables de características, de las cuales más de cinco (5) son variables categóricas.
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 fórmula ~RACE-1
especifica que R debe crear variables ficticias a partir de la variable RACE
, pero suprime la intercepción (de modo que cada columna represente si una observación proviene de una categoría específica); el valor predeterminado, sin -1
, es hacer que la primera columna sea un término de intercepción (todos unos), omitiendo la variable ficticia para el nivel base (primer nivel del factor) de la matriz del modelo.
En general, es posible que desee algo como
dd0 <- subset(dd,select=-CLASS)
data.frame(model.matrix(~.-1,dd0),CLASS=dd$CLASS)
Tenga en cuenta que cuando tenga varias variables categóricas, tendrá que hacer algo un poco complicado si desea conjuntos completos de variables ficticias para cada una. cbind()
en cbind()
en matrices de modelos separados, pero creo que también hay un truco para hacer todo esto de una vez que olvido ...