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()将单独的模型矩阵放在一起,但我认为还有一些技巧可以让我忘记...