在插入符号包 - R 中使用 dummyVars 后,分类列被删除

Classification column is removed after using dummyVars in caret package - R

我正在研究 caret 包并遇到了这个问题。

我正在使用 dummyVars 将我的分类列拆分为单独的虚拟变量。似乎 dummyVars 代码删除了输入数据集中的分类列。例如:

library(earth)
data(etitanic)
dummies <- dummyVars(survived ~ ., data = etitanic, levelsOnly = FALSE)
et<-as.data.frame(predict(dummies, newdata = etitanic))
names(et)

[1] "pclass.1st" "pclass.2nd" "pclass.3rd" "sex.female" "sex.male"   "age"       
[7] "sibsp"      "parch"  

因此,当我尝试拆分数据时,出现错误。

train = createDataPartition(et$survived, p=.75, list=FALSE)

Error in createDataPartition(et$survived, p = 0.75, list = FALSE) : 
  y must have at least 2 data points

任何人都可以告诉我这是否是插入符号的 dummyVars 的预期行为。我可以使用 say

轻松地将幸存列添加到数据集中
et$survived<-etitanic$survived

然后训练模型。但我认为必须有更好的方法,否则插入符号包不会删除分类列。我在这里错过了什么吗?有人可以对此进行更多说明吗?

谢谢

据我所知,没有办法保留 classification 列(或者至少不是一个因素;那是因为输出是一个矩阵,因此它总是数字) .这是因为 dummyVars 函数的目的是为因子预测变量创建虚拟变量。它还旨在为基础 R 函数 model.matrix 提供替代方案,后者提供更多选择(model.matrix 也不保留 classification 列)。

此外,也许更重要的是,要求 classification 列是因子 class 且仅是因子 class 的函数提供了一种方法来提供因子作为一个单独的参数(如 e1071 包中的 svm 函数)或明确要求它作为一个单独的参数(如 FNN 包中的 knn 函数)。在这两种情况下,您都不需要在 data.frame 中包含该因素。您只需在要使用的函数中将其作为单独的向量提供。

但是,对于不需要 classification 列为因子类型的情况,还有一种替代方法,在这种情况下,您可以简单地执行以下操作:

library(earth)
data(etitanic)
etitanic2 <- etitanic
#convert the classification colunn to numeric
etitanic2$survived <- as.numeric(etitanic2$survived)
#use formula without specifying the response variable
dummies <- dummyVars( ~ ., data = etitanic, levelsOnly = FALSE)
et<-as.data.frame(predict(dummies, newdata = etitanic))
names(et)

> names(et)
[1] "pclass.1st" "pclass.2nd" "pclass.3rd" "survived"   "sex.female" "sex.male"   "age"       
[8] "sibsp"      "parch" 

通过将 classification 列转换为数字并且不在公式中指定响应变量,survived 列保留在输出 data.frame 中,但从数字 class.