use*_*897 1 r categorical-data
我有一个包含 6 个级别的分类变量的数据框。
x$response <- data.frame(rep(1:6,10))
x
Run Code Online (Sandbox Code Playgroud)
我想根据级别创建 6 个不同的二进制列。例如:
x$response1 <- 0
x$response1[x[,1]=='1'] <- 1
x$response2 <- 0
x$response2[x[,1]=='2'] <- 1
Run Code Online (Sandbox Code Playgroud)
我可以用上面提到的方法做,但需要重复6次。我想知道是否有更好的方法来做到这一点。如果我有 30 个级别,我该怎么办?
我的最终目标是评估每个预测变量的重要性或信息增益。我这样做是为了为每个响应类别创建一个 logit 模型并使用不同的预测变量组合执行方差分析。但是,我如何评估每个预测变量和响应类别组合的信息增益。
x <- data.frame(response = factor(rep(1:6,10)))
model.matrix(~., x)
Run Code Online (Sandbox Code Playgroud)
对于奖励积分:
Matrix::sparse.model.matrix(~., x)
Run Code Online (Sandbox Code Playgroud)
正如 John Madden 在评论中所指出的,R 在大多数建模函数中自动执行前者,例如lm。还要注意,这不是完整的矩阵。R 自动删除第一个虚拟变量以避免虚拟变量 trap。您可以按如下方式关闭此行为(请注意,在这种情况下,拦截项已删除):
model.matrix( ~ 0 + ., x)
Matrix::sparse.model.matrix( ~ 0 + . , x)
Run Code Online (Sandbox Code Playgroud)
对于较大的数据集,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
)
Run Code Online (Sandbox Code Playgroud)
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
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1848 次 |
| 最近记录: |