Написать разреженную матрицу в CSV в R - PullRequest
4 голосов
/ 30 декабря 2010

У меня есть разреженная матрица (dgCMatrix) в результате подгонки glmnet. Я хочу записать этот результат в .csv, но не могу использовать write.table() матрицу, потому что она не может быть приведена к data.frame.

Есть ли способ привести разреженную матрицу к data.frame или к регулярной матрице? Или есть способ записать его в файл, сохранив имена коэффициентов, которые, вероятно, являются именами строк?

Ответы [ 4 ]

10 голосов
/ 23 мая 2012

Это будет опасно для преобразования разреженной матрицы в нормальную, если размер разреженной матрицы слишком велик. В моем случае (задача классификации текста) я получил матрицу размером 22490 на 120 000. Я думаю, если вы попытаетесь получить плотную матрицу, это будет более 20 ГБ. Тогда R сломается!

Итак, мое предложение, вы можете просто хранить разреженную матрицу эффективным и удобным для памяти способом, таким как Matrix Market Format , в котором хранятся все ненулевые значения и их координаты (номер строки и столбца). В R вы можете использовать метод writeMM

5 голосов
/ 30 декабря 2010

as.matrix() преобразуется в полное плотное представление:

> as.matrix(Matrix(0, 3, 2))
     [,1] [,2]
[1,]    0    0
[2,]    0    0
[3,]    0    0

Вы можете записать полученный объект, используя write.csv или write.table.

4 голосов
/ 29 июня 2016

Преобразование напрямую в плотную матрицу может привести к потере большого количества памяти. Матрица пакета R позволяет преобразовать разреженную матрицу в фрейм данных координатного триплетного формата с эффективным использованием памяти, используя функцию summary(), которая затем может быть легко записана в csv. Это, вероятно, проще и проще, чем подход рынка матриц. См. Ответ на этот связанный вопрос: Разреженная матрица для фрейма данных в R

Кроме того, вот иллюстрация из документации пакета Matrix :

## very simple export - in triplet format - to text file:
data(CAex)
s.CA <- summary(CAex)
s.CA # shows  (i, j, x)  [columns of a data frame]
message("writing to ", outf <- tempfile())
write.table(s.CA, file = outf, row.names=FALSE)
## and read it back -- showing off  sparseMatrix():
str(dd <- read.table(outf, header=TRUE))
## has columns (i, j, x) -> we can use via do.call() as arguments to sparseMatrix():
mm <- do.call(sparseMatrix, dd)
stopifnot(all.equal(mm, CAex, tolerance=1e-15))
3 голосов
/ 17 ноября 2015
# input: a sparse matrix with named rows and columns (dimnames)
# returns: a data frame representing triplets (r, c, x) suitable for writing to a CSV file
sparse2triples <- function(m) {
 SM = summary(m)
 D1 = m@Dimnames[[1]][SM[,1]]
 D2 = m@Dimnames[[2]][SM[,2]]
 data.frame(row=D1, col=D2, x=m@x)
}

Пример

> library(Matrix)
> dn <- list(LETTERS[1:3], letters[1:5])
> m <- sparseMatrix(i = c(3,1,3,2,2,1), p= c(0:2, 4,4,6), x = 1:6, dimnames = dn)

> m
3 x 5 sparse Matrix of class "dgCMatrix"
  a b c d e
A . 2 . . 6
B . . 4 . 5
C 1 . 3 . .

> sparse2triples(m)
  row col x
1   C   a 1
2   A   b 2
3   B   c 4
4   C   c 3
5   A   e 6
6   B   e 5 

[РЕДАКТИРОВАТЬ: использовать data.frame]

...