在R中编写一个非常大的稀疏矩阵以归档

时间:2019-02-15 15:41:04

标签: r bigdata sparse-matrix

我有一个稀疏矩阵,尺寸约为〜400K x〜8k。

我想将其保存为制表符分隔的文件或csv文件,因为我需要将其作为另一个程序的输入。

如本文所建议的,我使用了MASS包中的write.matrix函数: How to save an adjacency matrix as a CSV file?

但是,出现以下错误:

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 :(得分:0)

这是使用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')导出值。