Однострочное кодирование в [R] | Категориальные переменные Dummy

Мне нужно создать новый фрейм данных nDF, который будет бинарировать все категориальные переменные и в то же время сохраняет все остальные переменные в кадре данных DF. Например, у меня есть следующие переменные функции: RACE (4 типа) и AGE, а выходная переменная называется 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

Я хочу преобразовать это в nDF с пятью (5) переменными или четырьмя (4) четными:

          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

Я знаком с контрастом обработки с переменной DF $RACE. Однако, если я реализую

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

то, что я получаю, по-прежнему является DF трех переменных, но с переменной DF $RACE, имеющей атрибут "контрасты".

В конечном итоге я хочу, чтобы это был новый кадр данных nDF, как показано выше, но который может быть очень утомительным для оценки того, имеет ли около 50 функциональных переменных, из которых более пяти (5) из них являясь категориальными переменными.

Ответ 1

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, заключается в том, чтобы сделать первый столбец термином перехвата (все), опуская фиктивную переменную для базового уровня (первый уровень фактора) из модельной матрицы.

В общем, вам может понадобиться что-то вроде

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

Обратите внимание, что когда у вас есть несколько категориальных переменных, вам придется кое-что немного сложнее, если вы хотите, чтобы для каждого из них были полные наборы фиктивных переменных. Я бы подумал об объединении отдельных матриц модели, но я думаю, что там тоже есть трюк за все это сразу, что я забыл...