如何强制 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.matrix
,cbind
并更改列名(如果需要)。
d1 <- do.call(cbind,lapply(names(d.data), function(i)
model.matrix(~get(i)-1, d.data)))
colnames(d1) <- sub('.*\)', '', colnames(d1))
描述 我有 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.matrix
,cbind
并更改列名(如果需要)。
d1 <- do.call(cbind,lapply(names(d.data), function(i)
model.matrix(~get(i)-1, d.data)))
colnames(d1) <- sub('.*\)', '', colnames(d1))