[R] |中的单热编码 分类为虚拟变量

EFL*_*EFL 18 r categorical-data

我需要创建一个新的数据帧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

我希望将其转换为具有五(5)个变量或四(4)个变量的nDF:

          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)
Run Code Online (Sandbox Code Playgroud)

我得到的仍然是三个变量的DF,但是变量DF $ RACE具有"对比"属性.

我最终想要的是如上所示的新数据框架nDF,但如果一个人有大约50个特征变量,其中超过五(5)个是分类变量,那么评估它可能非常繁琐.

Ben*_*ker 28

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
Run Code Online (Sandbox Code Playgroud)

该公式~RACE-1指定R应该从RACE变量创建虚拟变量,但是抑制截距(以便每列表示观察是否来自指定的类别); 默认情况下,没有-1,是使第一列成为一个截距项(全部为1),从模型矩阵中省略基线级别(因子的第一级)的虚拟变量.

更一般地说,你可能想要类似的东西

 dd0 <- subset(dd,select=-CLASS)
 data.frame(model.matrix(~.-1,dd0),CLASS=dd$CLASS)
Run Code Online (Sandbox Code Playgroud)

请注意,当您有多个分类变量时,如果您想要为每个变量设置完整的虚拟变量,那么您将需要做一些有点棘手的事情.我会想到cbind()将单独的模型矩阵放在一起,但我认为还有一些技巧可以让我忘记...

  • `RACE`表示根据治疗对比将分类变量转换为虚拟变量; `-1`表示省略截距项 (2认同)
  • 请注意,数字编码的列必须存储为`character`或`factor`,否则`model.matrix`将保留为它. (2认同)