具有数值和分类数据的稀疏矩阵
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
。后者将为您的第一个因素删除一个级别,但为其他因素保留所有级别,因此这取决于变量的顺序。
我正在尝试创建一个包含数值和分类数据的稀疏矩阵,这些数据将用作 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
。后者将为您的第一个因素删除一个级别,但为其他因素保留所有级别,因此这取决于变量的顺序。