单细胞数据_不同类型的数据介绍与Scanpy读取
(单细胞下游分析——存储方式汇总,不同类型的数据读入)
数据读入采取scanpy库进行:scanpy库是用于单细胞数据分析的 Python 库
下面几种数据存储的核心数据都是一样的,只是格式不同。
.h5ad(anndata 数据格式)
.h5ad数据结构解释(anndata 数据格式)
官方网站:https://anndata.readthedocs.io/en/latest/ ,下面的内容官网都有
h5ad文件提供了一种可扩展的方式来记录数据及其注释 (annotation),主要包含X, obs, var, uns等多个部分,分别存储不同的信息。结构如下图所示
主要由以下几部分构成:
功能 | 数据类型 | 说明 | |
---|---|---|---|
adata.X | 表达量矩阵 | ndarray,scipy sparse,matrix, DataFrame | X用来联系obs和var,其中行代表细胞,列代表基因,每个元素的值代表该基因在该细胞中的表达量。 |
adata.obs | 观察值数据 | DataFrame,Mapping[str, Iterable[Any]] | obs从不同维度描述细胞的信息,不同数据集不同。 |
adata.var | 特征和高可变基因数据 | DataFrame,Mapping[str, Iterable[Any]] | var从不同维度描述基因的结果,不同数据集不同。 |
adata.uns | 非结构化注释 | Mapping[str, Any] | 其他注释 |
- 其余看官方解释吧
读取
注意:.h5ad和.h5两个读取方式不同
#导入scanpy库
import scanpy as sc
#读取
data=sc.read_h5ad('XXXXX.h5ad')
#查看数据
print(data)
.h5 (HDF5)
Hierarchical Data Format (HDF5)文件,HDF5 是一种用于存储和组织大规模科学数据的文件格式。在单细胞数据中,可以使用 HDF5 存储表达矩阵、基因和细胞的元数据等信息。
AnnData的.h5ad文件,是基于 HDF5 的文件格式,参考h5ad即可。
注意:.h5ad和.h5两个读取方式不同
读取
#导入scanpy库
import scanpy as sc
#读取
data=sc.read_10x_h5('XXXXX.h5')
#查看数据
print(data)
10x_mtx(cell ranger输出,三个文件)
就是cell ranger上游比对分析产生的3个文件:
├── xxx_feature_bc_matrix
│ ├── barcodes.tsv.gz:细胞标签(barcode)
│ ├── features.tsv.gz:基因ID(feature)
│ └── matrix.mtx.gz:表达数据(matrix),该文件包含了一个稀疏矩阵,其中每一行代表一个基因,每一列代表一个细胞,每个元素则表示基因在相应细胞中的表达量
具体文件格式如下:
>barcodes.tsv.gz
AAACCCAAGAAACCCA-1
AAACCCAAGAAAGTCT-1
AAACCCAAGAAATTGC-1
AAACCCAAGAACAAGG-1
============
>features.tsv.gz
ENSG00000243485 MIR1302-2HG Gene Expression
ENSG00000237613 FAM138A Gene Expression
ENSG00000186092 OR4F5 Gene Expression
ENSG00000238009 AL627309.1 Gene Expression
============
>matrix.mtx.gz
%%MatrixMarket matrix coordinate integer general
%metadata_json: {"software_version": "Cell Ranger cellranger-8.0.1", "format_version": 2}
36601 643092 12843054
19846 1 1
8208 2 1
31505 3 1
22399 4 1
读取
#导入scanpy库
import scanpy as sc
#读取
data=sc.read_10x_mtx('path')# 注意是path,即上图中的3个文件所在的文件目录
#查看数据
print(data)
对于R语言,一般先使用read10X()对这三个文件进行整合,得到行为基因、列为细胞的表达矩阵(为稀疏矩阵dgCMatrix格式,节约内存);然后再配合CreateSeuratObject()函数创建Seurat对象
tsv/csv/txt/tab(一个文件)
提醒:.gz是一种压缩格式,.gz前的只要是这几个数据类型,就可以使用。
这些文件本质都是txt,文件里面包含了转成10x_mtx 格式的所有信息:
- 第一行是条形码(基因序列)(barcodes.tsv.gz)
- 第一列是基因(features.tsv.gz)
- 其余就是0/1矩阵(reads 计数)(matrix.mtx.gz)
读取和排错
#导入scanpy库
import scanpy as sc
#读取
data=sc.read_text('XXXXX.counts.matrix.tsv.gz')# tsv/csv/txt/tab数据一样,只是换个名字
#查看数据
print(data)
注意:read_text可能会读错信息,即:obs存储基因信息和var存储细胞信息,使用data_T=data.T
即可转置。
查找错误和解决代码如下:
# 输出var
print(data.var) #如果是类似的 AL627309.1,则表明读入正确,不需要转置。
# 或者 输出obs
print(data.obs) #如果是类似的 AAACCTGAGTCATGCT-1,则表明读入正确,不需要转置。
#解决方案
data_T=data.T
按照obs的batch列拆分anadata
import scanpy as sc
# 假设 adata 是你的 AnnData 对象
# 按照 'batch' 列拆分 AnnData
batches = adata.obs['batch'].unique() # 获取所有独特的批次值
# 创建一个字典存储拆分后的 AnnData 子集
# adata_splits 字典的每个键是一个 batch 值,对应的值是一个新的 AnnData 子集。
adata_splits = {batch: adata[adata.obs['batch'] == batch].copy() for batch in batches}
# 现在 adata_splits 是一个字典,键是批次,值是对应批次的数据
for batch, adata_batch in adata_splits.items():
# 对每个批次的数据进行操作
sc.pp.scale(adata_batch) # 举例:对每个批次进行标准化