sparseMatrix具有数字和分类数据

时间:2015-04-06 20:34:02

标签: r sparse-matrix model.matrix

我正在尝试创建一个包含数字和分类数据的稀疏矩阵,这些数据将用作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个观察值和10,000个变量。我没有足够的内存来首先创建完整的矩阵。我能想到创建sparseMatrix的唯一方法是通过创建列并以(i,j,x)格式转换数据来手动处理分类变量。我希望有人能提出更好的方法。

2 个答案:

答案 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。后者将删除第一个因子的一个级别,但保留其他级别的所有级别,因此它取决于变量的顺序。