查看原文
其他

​答读者问 (十五)稀疏矩阵转matrix, as.matrix函数是下下策

BIOMAMBA Biomamba 生信基地 2024-04-03




往期回顾




答读者问 (一)单基因究竟能否进行GSEA

答读者问 (二)为什么我的PCA分析报错了?

答读者问 (三)单细胞测序前景

答读者问 (四)如何分析细胞亚群

答读者问 (五)如何实现各物种基因的ID/symbol的转换

答读者问 (六)Seurat中如何让细胞听你指挥

答读者问 (七)有人问我Biomamba何解

答读者问 (八)为什么Read10X也会报错?

答读者问 (九) 如何将数百个文件整合为一个矩阵

答读者问 (十)整合后的表达矩阵,如何拆分出分组信息?

答读者问 (十一)如何一次性读取一个目录下的cellranger输出文件?

答读者问 (十二)ERROR: have no zero exit status
答读者问 (十三)查看Seurat对象时的ERROR:type='text'

答读者问 (十四)Seurat中分类变量处理技巧





问题




最近总是有粉丝遇到下图这么个问题,看起来这个稀疏矩阵过大,as.data.frame()处理不了了。




怎么解决问题




在单细胞测序的分析过程中,我们经常需要把Seurat对象中的稀疏矩阵转换为二维矩阵/数据框,很多小伙伴会用as.data.frame()或者as.matrix()之类的函数,但是这个函数运行起来效率非常之低下,并且有时会遇到内存不足的问题,具体我们来感受一下library(Seurat)
## Attaching SeuratObject
mydgmatrix <- Read10X('filtered_gene_bc_matrices/hg19/')
class(mydgmatrix)#这是一个稀疏矩阵
## [1] "dgCMatrix"
## attr(,"package")
## [1] "Matrix"
system.time({
mymatrix <- as.matrix(mydgmatrix)
})
## user system elapsed
## 0.658 0.571 1.230

system.time({
mymatrix <- as.data.frame(mydgmatrix)
})
## user system elapsed
## 2.915 1.056 3.971
上面用到的是测试文件因此运行的比较快,但是我们也可以发现,as.matrix()的速度明显要比as.data.frame要快一些,那么,有没有更快的方法呢?当然有:Rcpp::sourceCpp(code='
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
IntegerMatrix asMatrix(NumericVector rp,
NumericVector cp,
NumericVector z,
int nrows,
int ncols){
int k = z.size() ;
IntegerMatrix mat(nrows, ncols);
for (int i = 0; i < k; i++){
mat(rp[i],cp[i]) = z[i];
}
return mat;
}
'
)#[1]


as.my.matrix <- function(mat){

row_pos <- mat@i
col_pos <- findInterval(seq(mat@x)-1,mat@p[-1])

tmp <- asMatrix(rp = row_pos, cp = col_pos, z = mat@x,
nrows = mat@Dim[1], ncols = mat@Dim[2])

row.names(tmp) <- mat@Dimnames[[1]]
colnames(tmp) <- mat@Dimnames[[2]]
return(tmp)
}
system.time({mymatrix <- as.my.matrix(mydgmatrix)})#看一下实际运行速度
## user system elapsed
## 0.238 0.332 0.572
#不用多说了吧,只用了as.data.frame的1/10,这只是一个测试数据,用真正大型的数据计算时效率会差的更多,并且这种循环的方式可以节省很多的内存。

[1]https://www.jianshu.com/p/3785feb91678






如何联系我们


最近发现后台中有一些消息我没能及时看到并答复,微信后台中超过48h后便不允许回复读者消息,这里还是再给大家留一下答疑的扣扣号,方便大家随时交流。微信号可以点击喜欢作者后自动回复里有。欢迎大家向我咨询或者提供建议大家可以阅读完这几篇之后添加我:如何搜索公众号过往发布内容
答疑公约
笑一笑也就算了


继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存