R model.matrix中缺少级别

R model.matrix中缺少级别,r,model.matrix,R,Model.matrix,我正在尝试将带有分类变量的数据框转换为model.matrix,但正在丢失变量的级别 这是我的密码: df1 <- data.frame(id = 1:200, y =rbinom(200, 1, .5), var1 = factor(rep(c('abc','def','ghi','jkl'),50))) df1$var2 <- factor(rep(c('ab c','ghi','jkl','def'),50)) df1$var3 <- factor(rep(c('abc

我正在尝试将带有分类变量的数据框转换为model.matrix,但正在丢失变量的级别

这是我的密码:

df1 <- data.frame(id = 1:200, y =rbinom(200, 1, .5),  var1 = factor(rep(c('abc','def','ghi','jkl'),50)))
df1$var2 <- factor(rep(c('ab c','ghi','jkl','def'),50))
df1$var3 <- factor(rep(c('abc','ghi','nop','xyz'),50))

df1$var2 <- as.character(df1$var2)
df1$var2 <- gsub('\\s','',df1$var2)
df1$var2 <- factor(df1$var2)
sapply(df1, levels)

mm1 <- model.matrix(~ 0+.,df1)
head(mm1)

df1模型矩阵完全正确。对于因子,模型矩阵包含的列比因子少一列:此信息已包含在
(Intercept)
列中。您缺少此列,因为您在模型术语中指定了
+0
。试试这个:

mm2 <- model.matrix(~., df1)
head(mm2)

mm2这是一个表示问题。R中的矩阵不保留其输入数据的属性,这恰好是因子存储其字符值的地方。我应该补充一点,如果您从因子创建模型矩阵,您应该看到列数的扩展,这些列应正确表示各种因子级别。在您的例子中,这意味着对于var2,“abc”级别将与var3中的“abc”级别分开考虑。除参考级别外的每个级别都将获得自己的1和0列。