我需要创建一个新的数据框 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)个特征变量可能非常繁琐。是分类变量。
答案 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()
将单独的模型矩阵放在一起,但我认为还有一些技巧可以让我忘记这一切......