我有一个多变量数据框,并希望将内部的分类数据转换为虚拟变量,我使用的是model.matrix,但它不太有效。请参考以下示例:
age = c(1:15) #numeric
sex = c(rep(0,7),rep(1,8)); sex = as.factor(sex) #factor
bloodtype = c(rep('A',2),rep('B',8),rep('O',1),rep('AB',4));bloodtype = as.factor(bloodtype) #factor
bodyweight = c(11:25) #numeric
wholedata = data.frame(cbind(age,sex,bloodtype,bodyweight))
model.matrix(~.,data=wholedata)[,-1]
我没有使用model.matrix(~age+sex+bloodtype+bodyweight)[,-1]
的原因是因为这只是一个玩具示例。在真实数据中,我可能有数十或数百列。我不认为在这里键入所有变量名称是个好主意。
由于
答案 0 :(得分:1)
cbind
正在弄乱事情。它会将您的因子转换为数字,然后model.matrix
无法正确解释。
如果您只是wholedata = data.frame(age,sex,bloodtype,bodyweight)
,那就没有问题。
cbind
返回一个矩阵,在矩阵中,所有内容都必须具有相同的类型。这个例子的结果是因子被转换为整数(这是一个因子的基础表示),然后矩阵的类型是整数。
尝试
wholedata = cbind(age,sex,bloodtype,bodyweight)
is.integer(wholedata) ## TRUE
is.factor(wholedata[,2]) ## FALSE
wholedata = data.frame(age,sex,bloodtype,bodyweight)
is.integer(wholedata) ## FALSE
is.factor(wholedata[,2]) ## TRUE