【问题标题】:R change categorical data to dummy variablesR将分类数据更改为虚拟变量
【发布时间】:2014-10-14 07:03:03
【问题描述】:

我有一个多变量数据框,想将里面的分类数据转换为虚拟变量,我使用了 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] 的原因是因为这只是一个玩具示例。在真实数据中,我可以有数十或数百列。我不认为在这里输入所有变量名是个好主意。

谢谢

【问题讨论】:

  • 如果你想在你的虚拟矩阵中显示每个级别(包括参考),你可以使用model.matrix(~ -1 + . , data=wholedata, contrasts.arg = lapply(wholedata[sapply(wholedata, is.factor)], contrasts, contrasts=FALSE))

标签: r categorical-data model.matrix


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

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 2021-01-01
    • 2019-02-08
    • 2021-07-27
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多