R最速文件读写 | 用R的dgCMatrix包来构建稀疏矩阵 | sparse matrix by dgCMatrix
累了,写了一个多合一的读取函数,非常适合单细胞数据。
# quickly read large txt file to data.frame, matrix, or dgCMatrix fast.read.txt <- function(fileName, sep=",", format="dataframe") { tmp.raw <- data.table::fread(fileName, sep=sep) # get rowname tmp.raw <- as.data.frame(tmp.raw) tmp.raw <- tmp.raw[!duplicated(tmp.raw[,1]),] rownames(tmp.raw) <- tmp.raw[,1] tmp.raw[,1] <- NULL # output format if (format=="dataframe") { return(tmp.raw) } else if (format=="matrix") { return(as.matrix(tmp.raw)) } else if (format=="dgCMatrix") { library(Matrix) return(as(as.matrix(tmp.raw), "dgCMatrix")) } else { stop("please input correct format!!!") } }
文本文件有其天然的优势,随时可以查阅,缺点就是占用太多存储空间。
我的单细胞数据大部分都会转为稀疏sparse矩阵来存储为Rdata,但是跨平台的话也会保留CSV的格式。
但是R内置的read.csv读写都奇慢无比,最近发现了data.table神器,fread和fwrite都直接秒杀了其他任何函数,不知道是什么做到的,以后默认就用这个好了。
E15_count <- data.table::fread("GSE149524_RAW/E15.5.csv")
library(Matrix) raw_count <- data.table::fread("rna_adata_raw_x.csv") raw_count <- as.data.frame(raw_count) # raw_count <- raw_count[!duplicated(raw_count$V1),] rownames(raw_count) <- raw_count$V1 raw_count$V1 <- NULL # raw_count[1:5,1:5] raw_count <- as(as.matrix(raw_count), "dgCMatrix") meta.info <- data.table::fread("rna.meta.info.csv")
The fastest way to Read and Writes file in R
唯一的缺点就是无法设置rowname,这是正常的,通常还要remove duplicate,然后data.table需要转化为dataframe或者matrix,可以自己包装成一个函数。
sparse matrix是用来存储大型稀疏矩阵用得,单细胞表达数据基本都用这个格式来存储,因为单细胞很大部分都是0,用普通文本矩阵存储太占空间。
使用也是相当简单:
library("Matrix") readsCount <- read.csv("data/count.csv", header = T, row.names = 1) readsCountSM <- as(as.matrix(readsCount), "dgCMatrix") # str(M1)
想转回去,as.matrix() 就可以了。
经测试, dgCMatrix格式的Rdata仅有CSV文本的十分之一大小,极大的节省了存储空间,建议转化成功后,删除所有CSV文本。
参考:
Coercion of matrix to sparse matrix (dgCMatrix) and maintaining dimnames.