【问题标题】:One-Hot Encoding in [R] | Categorical to Dummy Variables [duplicate][R] 中的 One-Hot 编码 |分类到虚拟变量
【发布时间】:2014-07-31 07:25:45
【问题描述】:

我需要创建一个新的数据框 nDF,它将所有分类变量二值化,同时将所有其他变量保留在数据框 DF 中。例如,我有以下特征变量:RACE(4 种类型)和 AGE,以及一个名为 CLASS 的输出变量。

DF =

种族年龄(21岁以下)班级 案例 1 西班牙裔 0 A 案例 2 亚洲 1 A 案例 3 西班牙裔 1 D 案例 4 白种人 1 B

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

RACE.1 RACE.2 RACE.3 年龄(21 岁以下)等级 案例 1 0 0 0 0 A 案例 2 0 0 1 1 A 案例 3 0 0 0 1 D 案例 4 0 1 0 1 B

我熟悉变量 DF$RACE 的处理对比。但是,如果我实施

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

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

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

【问题讨论】:

  • 如果您愿意使用data.table 包,您可以使用mltools 中的one_hot() 方法。

标签: r categorical-data


【解决方案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)

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

【讨论】:

  • 我一定会尝试您在此处建议的这个,并使用 cbind() 进行更多探索。这真的很有帮助。如果我有更多的声望,我会投票赞成你的答案。
  • 看不懂~RACE-1的意思?
  • RACE 表示根据治疗对比将分类变量转换为虚拟变量; -1 表示省略拦截项
  • 请注意,数字编码的列必须存储为characterfactor,否则model.matrix 将保留它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 2019-08-13
  • 2023-04-08
  • 2017-11-24
  • 2017-11-06
  • 2017-01-08
相关资源
最近更新 更多