拼接12个AnnData对象遇基因重复问题,求正确合并方法
解决方案
问题根源
你之前误用了sc.concat的axis=1参数:该参数用于合并列(基因),会将所有样本的基因列直接拼接,导致相同基因名被自动添加后缀去重。而你的需求是合并行(barcode),将不同样本的唯一barcode整合到同一个AnnData中,同时对齐所有基因并为缺失基因填充0。
实现步骤
生成全局基因集合
提取所有12个AnnData对象中的基因名,取它们的并集作为统一的基因列表:import scanpy as sc import anndata as ad import pandas as pd # 获取所有样本的基因并集 all_genes = set() for adata in loom_data: all_genes.update(adata.var.index) all_genes = sorted(all_genes)对齐每个AnnData到全局基因列表
对每个样本的AnnData重新索引,确保其基因列与全局列表一致,缺失基因的计数(包括剪接/未剪接矩阵)自动填充0:aligned_adatas = [] for adata in loom_data: # 对齐主计数矩阵(X) adata_aligned = adata[:, all_genes].copy() # 处理spliced和unspliced层 for layer in ["spliced", "unspliced"]: if layer in adata.layers: # 将层矩阵转为DataFrame后重新索引,填充0 layer_matrix = pd.DataFrame( adata.layers[layer], index=adata.obs.index, columns=adata.var.index ) layer_matrix_aligned = layer_matrix.reindex(columns=all_genes, fill_value=0) adata_aligned.layers[layer] = layer_matrix_aligned.values aligned_adatas.append(adata_aligned)合并对齐后的AnnData
使用axis=0(默认值,合并行)拼接所有对齐后的样本,此时所有barcode会整合为行,基因列完全对齐,缺失值已被填充0:merged_adata = sc.concat(aligned_adatas, join="outer")
验证结果
合并后你会得到一个AnnData对象,其维度应为总barcode数 × 全局基因数,且基因名不会出现重命名后缀,缺失基因的剪接/未剪接计数均为0,可直接用于scVelo分析。
内容的提问来源于stack exchange,提问作者CelineDion
相关产品推荐
相关产品推荐

