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

时间:2014-06-10 13:35:45

标签: 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)

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

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

1 个答案:

答案 0 :(得分: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

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

更一般地说,您可能需要类似

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

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