sparseMatrix с числовыми и категориальными данными
Я пытаюсь создать разреженную матрицу с числовыми и категориальными данными, которые будут использоваться в качестве входных данных для 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")))
Мой ОЧЕНЬ редкий экземпляр имеет 1000 000 наблюдений и 10 000 переменных. У меня недостаточно памяти, чтобы сначала создать полную матрицу. Единственный способ, которым я могу думать о создании sparseMatrix, - это ручная обработка категориальных переменных путем создания столбцов и преобразования данных в формат (i,j,x). Я надеюсь, что кто-то может предложить лучший подход.
2 ответа
Это может или не может работать, но вы можете попробовать создать матрицы моделей для каждой переменной в отдельности, а затем cBind
объединяя их.
do.call(cBind,
sapply(names(df), function(x) sparse.model.matrix(~., df[x])[, -1, drop=FALSE]))
Обратите внимание, что вы, вероятно, хотите создать столбец перехвата, а затем удалить его, а не указывать -1
в формуле, как вы сделали выше. Последний удалит один уровень для вашего первого фактора, но сохранит все уровни для остальных, так что это зависит от порядка переменных.
Разреженные матрицы имеют ту же емкость, что и плотные матрицы для назначения позициям, использующим двухколоночную матрицу в качестве единственного аргумента для "[":
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,] . . . . . . . . . .