我有一个包含6个级别的分类变量的数据框架。
x$response <- data.frame(rep(1:6,10))
x
我想根据级别创建6个不同的二进制列。如:
x$response1 <- 0
x$response1[x[,1]=='1'] <- 1
x$response2 <- 0
x$response2[x[,1]=='2'] <- 1
我可以用上面提到的方法做,但需要重复6次。我想知道是否有更好的方法。如果我有30个关卡,我该怎么做?
我的最终目标是评估每个预测器的重要性或信息增益。我这样做是为了为每个响应类别创建一个logit模型,并使用预测因子的不同组合执行方差分析。但是,我如何评估每个预测器和响应类别组合的信息增益呢?
x <- data.frame(response = factor(rep(1:6,10)))
model.matrix(~., x)
附加积分:
Matrix::sparse.model.matrix(~., x)
正如John Madden在评论中所指出的,R在大多数建模函数中自动执行前者,例如lm
。还要注意,这不是一个完整的矩阵。R自动丢弃第一个虚拟变量以避免虚拟变量陷阱。您可以按如下方式关闭此行为(注意,在这种情况下,删除了拦截项):
model.matrix( ~ 0 + ., x)
Matrix::sparse.model.matrix( ~ 0 + . , x)
对于较大的数据集,sparse.model.matrix
可能是您最好的选择:
#100 factor levels
library(microbenchmark)
library(Matrix)
x <- rep(1:100,1000)
microbenchmark(
mm = model.matrix(~0+factor(x)),
smm = sparse.model.matrix(~0+factor(x)),
o = outer(x, unique(x), `==`),
m = sparseMatrix(1:length(x), match(x,unique(x))),
times=25
)
sparseMatrix(1:length(x), match(x,unique(x)))
甚至更快,如果这是你需要的。
#10 levels
library(microbenchmark)
library(Matrix)
x <- rep(1:10,10000)
microbenchmark(
mm = model.matrix(~0+factor(x)),
smm = sparse.model.matrix(~0+factor(x)),
o = outer(x, unique(x), `==`),
sm = sparseMatrix(1:length(x), match(x,unique(x))),
times=25
)
扎克方法的更有效版本
outer(x, sort(unique(x)), `==`)