具有数值和分类数据的稀疏矩阵

sparseMatrix with numerical and categorical data

我正在尝试创建一个包含数值和分类数据的稀疏矩阵,这些数据将用作 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) 格式来手动处理分类变量。我希望有人可以提出更好的方法。

稀疏矩阵与密集矩阵具有相同的容量,用于使用两列矩阵作为“[”:

的单个参数来分配位置
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,]  .         .         .        . . .  .       .  .         .

这可能有效也可能无效,但您可以尝试分别为每个变量创建模型矩阵,然后 cBind 将它们组合在一起。

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

请注意,您可能想要创建截距列然后将其删除,而不是像上面那样在公式中指定 -1。后者将为您的第一个因素删除一个级别,但为其他因素保留所有级别,因此这取决于变量的顺序。