我正在尝试创建一个包含数字和分类数据的稀疏矩阵,这些数据将用作cv.glmnet的输入。当只涉及数字数据时,我可以使用以下语法
创建sparseMatrixsparseMatrix(i=c(1,3,5,2), j=c(1,1,1,2), x=c(1,2,4,3), dims=c(5,2))
对于分类变量,以下方法似乎有效:
sparse.model.matrix(~-1+automobile, data.frame(automobile=c("sedan","suv","minivan","truck","sedan")))
我的非常稀疏的实例有1,000,000个观察值和10,000个变量。我没有足够的内存来首先创建完整的矩阵。我能想到创建sparseMatrix的唯一方法是通过创建列并以(i,j,x)格式转换数据来手动处理分类变量。我希望有人能提出更好的方法。
答案 0 :(得分:2)
稀疏矩阵具有与密集矩阵相同的容量,可以使用两列矩阵作为“[”的单个参数赋值给位置:
require(Matrix)
M <- Matrix(0, 10, 10)
dfrm <- data.frame(rows=sample(1:10,5), cols=sample(1:10,5), vals=rnorm(5))
dfrm
#---------
rows cols vals
1 3 9 -0.1419332
2 4 3 1.4806194
3 6 7 -0.5653500
4 5 1 -1.0127539
5 1 2 -0.5047298
#--------
M[ with( dfrm, cbind(rows,cols) ) ] <- dfrm$vals
M
#---------------
M
10 x 10 sparse Matrix of class "dgCMatrix"
[1,] . -0.5047298 . . . . . . . .
[2,] . . . . . . . . . .
[3,] . . . . . . . . -0.1419332 .
[4,] . . 1.480619 . . . . . . .
[5,] -1.012754 . . . . . . . . .
[6,] . . . . . . -0.56535 . . .
[7,] . . . . . . . . . .
[8,] . . . . . . . . . .
[9,] . . . . . . . . . .
[10,] . . . . . . . . . .
答案 1 :(得分:1)
这可能有效,也可能无效,但您可以尝试单独为每个变量创建模型矩阵,然后cBind
将它们放在一起。
do.call(cBind,
sapply(names(df), function(x) sparse.model.matrix(~., df[x])[, -1, drop=FALSE]))
请注意,您可能希望创建拦截列然后将其删除,而不是像上面那样在公式中指定-1
。后者将删除第一个因子的一个级别,但保留其他级别的所有级别,因此它取决于变量的顺序。