2015-04-06 76 views
0

我想创建一个稀疏矩阵与数值和分类数据将被用作cv.glmnet的输入。当只有数值数据参与,我可以使用下面的语法sparseMatrix与数值和分类数据

sparseMatrix(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意见和10000变量。我没有足够的内存来首先创建完整的矩阵。我能想到创建sparseMatrix的唯一方法是通过创建列并以(i,j,x)格式转换数据来手动处理分类变量。我希望有人能提出更好的方法。

+0

如何提供数据样本? – desertnaut

回答

1

,但你可以尝试分别为每个变量创建模型矩阵,然后将它们组合在一起。

do.call(cBind, 
     sapply(names(df), function(x) sparse.model.matrix(~., df[x])[, -1, drop=FALSE])) 

请注意,您可能需要创建拦截列,然后将其删除,而不是在公式中指定-1你之前所做的那样。后者将为您的第一个因子删除一个等级,但保留其他等级的所有等级,因此它取决于变量的排序。

2

稀疏矩阵有使用两个-column矩阵作为一个参数为“[”相同的容量,密集矩阵用于分配给位置:这可能会或可能无法正常工作

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,] .   .   .  . . . .  . .   .