因为想用NicheNet,所以终于下定决心攻克从AnnData到Seurat的转换了
因为我基本上用Scanpy那一套分析得比较多,Seurat用得很少很少,所以打算顺便学习一下Seurat那一套。感觉还是灵活使用两种方法会更有利于分析。
关于AnnData和Seurat之间的转化,我试过很多包,比如SeuratDisk
,scDioR
,sceasy
之类,但总是会有各种各样的问题,也想过要不要用Loom文件作为中间载体。
最终还是打算先用最基础的方法试一试,以及感觉还是要在理解Seurat的基础上在进行转换会更好。
一、最基础最稳定的转换
即直接把AnnData拆分成barcodes.tsv.gz
,features.tsv.gz
,matrix.mtx.gz
(coo_matrix格式的sparse 矩阵)和metadata.csv
,然后读入Seurat
在保存matrix.mtx.gz
后用R读取时出了一些问题
如:
Error in scan(file, nmax = 1, what = what, quiet = TRUE, ...) :
scan()需要'an integer', 而不是'0.0000000000000000e+00'
Error in readMM(paste0(save_dir, "/counts.mtx")) :
'readMM()' is not yet implemented for representation 'array'
第一种报错astype('int')可以解决
第二种未能解决,因此直接保存csv格式的dataframe,在R中转为稀疏矩阵
data1 <- read.csv("/counts.csv", header = T, row.names = 1)
# csv矩阵转换成数据框
datan = data.frame(data1)
# 数据框转换成稀疏矩阵matrix
counts <- as(as.matrix(datan), "dgCMatrix")
后续步骤:
cellMeta<-read.csv(paste0(save_dir,'/counts_cellMeta.csv'))
head(cellMeta)
dim(cellMeta)
geneMeta<-read.csv(paste0(save_dir,'/counts_geneMeta.csv'))
dim(geneMeta)
head(geneMeta)
### Set the rownames and colnames
rownames(counts)<-cellMeta$Barcode
colnames(counts)<-geneMeta$GeneName
#Construct Seurat object
seo <- CreateSeuratObject(counts = t(counts),
project = "min",
min.cells = 3,
min.features = 200)
### Set the meta data
seo@meta.data<-cbind(cellMeta,seo@meta.data)
rownames(seo@meta.data)<-colnames(seo)
二、理解Seurat对象的格式
至此,我们重新构建了Seurat的对象
……话虽如此,Seurat对象到底是什么呢,和AnnData又有什么区别呢
![](https://img.haomeiwen.com/i27560883/cd374b6ca20ecd86.png)
- AnnData是细胞为行基因为列,而Seurat里面是以基因为行和细胞为列,所以在做Expression matrix的时候别忘了转置。
- 槽(slots):这些不同类型的数据都存储在sce对象的不同部分中,这些部分称为槽(slots)。每个槽中的数据可以通过以各自的槽(箭头)命名的访问器以编程方式访问,比如rowRanges指的是特征元数据(相当于AnnData中的
.var
),colData指的是样本元数据(相当于AnnData中的.obs
),assay指的是数据(相当于AnnData中的.X
),不同层的assay相当于AnnData的.layers
。
- 对象操作
① 通过结构图上的@,$符号依次取(和AnnData的对比:adata.obs['group']
)
② 两个中括号操作,pbmc[[ ]]。
这两种操作在引用Assays\Reductions的下属内容中无差别,meta.data时会输出不同的数据格式
网友评论