如何强制 model.matrix 使用 2 个分类变量的所有级别?

how to force model.matrix to use all levels of 2 categorical variables?

描述 我有 2 个分类变量,我想将它们变成列 - 对于每个类别只有一列

进度 实现此目的的简单代码:

d.data <- data.frame(a=as.factor(c("some1","some2","some3")), b = as.factor(c("other1","other3","other2")))
d.data.new <- data.frame(model.matrix(~a -1 + b -1, data=d.data))
names(d.data.new)

[1] "asome1" "asome2" "asome3" "bother2" "bother3"

"-1" 仅适用于 "a" 变量,它由整个 3 个级别表示,但 "b" 只有两个 - 我需要整个 3。 不太明白在这种情况下,“-1”是如何工作的,因为 {formula} inside model.matrix

不是 model.matrix 解决方案,但您可以使用 mtabulate

获得二进制输出
library(qdapTools)
mtabulate(as.data.frame(t(d.data)))

或者另一种选择是遍历 'd.data' 的列名并在每列上分别执行 model.matrixcbind 并更改列名(如果需要)。

d1 <- do.call(cbind,lapply(names(d.data), function(i) 
                      model.matrix(~get(i)-1, d.data)))
colnames(d1) <- sub('.*\)', '', colnames(d1))