Запись очень большой разреженной матрицы в файл в R - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть разреженная матрица с размерами ~ 400K x ~ 8k.

Я хотел бы сохранить это как файл с разделителями табуляции или CSV-файл, так как он мне нужен как вход для другой программы.

Я использовал функцию write.matrix из пакета MASS, как предлагается из этого поста: Как сохранить матрицу смежности в виде файла CSV?

Однако я получаюследующая ошибка:

library(MASS)
write.matrix(data,"data_sparseMat.txt",sep="\t")  
#Error in asMethod(object) : Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105

Глядя на помощь, я попытался задать параметр blocksize.Я попробовал 1000, 10000, 100000. Все выдало мне ту же ошибку

write.matrix(data,"data_sparseMat.txt",sep="\t", blocksize=1000)  
Error in asMethod(object) : 
  Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105

Буду признателен за любую информацию, что я пропускаю?

R версия:

R version 3.5.2 (2018-12-20)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6

Пример:

w <- data.table( "id" = 1:300000 , "code" = paste(letters,1:9000,sep=""), "measure"=1:3000)
w$id <- factor(w$id)
w$code <- factor(w$code)

z<- sparseMatrix(as.integer(w$id),as.integer(w$code),x=w$measure,dimnames=list(levels(w$id),levels(w$code)))
write.matrix(z,"sparseTest.txt",sep="\t")
write.matrix(z,"sparseTest.txt",sep="\t",blocksize=100000)

ПРИМЕЧАНИЕ: когда код просто 1000 или 3000 вместо 9000, кажется, что он записывается в файл, хотя и медленно.

Большое спасибо.

1 Ответ

0 голосов
/ 24 июня 2019

Это обходной путь с использованием Python.Мне удалось экспортировать матрицу, которая была слишком большой в R.

Экспортировать данные в R как разреженную матрицу:

library(Matrix)
write(colnames(sparsematrix), file = "colnames.txt")
write(rownames(sparsematrix), file = "rownames.txt")
writeMM(sparsematrix, file = "sparsematrix.txt")

Прочитать, а затем преобразовать в Python:

from scipy import sparse, io
import pandas as pd
import numpy as np

sparsematrix = io.mmread('sparsematrix.txt')

m_dense = sparsematrix.toarray()

var_names = np.genfromtxt('rownames.txt', dtype=str)
col_names = np.genfromtxt('colnames.txt', dtype=str)

# Export to txt:
df = pd.DataFrame(m_dense, columns=col_names, index=var_names)
df.to_csv('export_sparsematrix.txt', sep='\t', header=True, index=True, index_label='Somelabel')

Вы можете пропустить часть имени строки и столбца и экспортировать значения только с помощью np.savetxt('m_dense.txt', m_dense, delimiter='\t').

...