Seurat-Scanpy互通 | R-Python互通
单细胞数据分析发展到现在,已经分化为两大阵营,Seurat和Scanpy,一个代表了R,有丰富的多组学package支持,一个代表了Python,为大数据和AI而生,都有其各自独特的优势,不可被取代。
作为资深用户就很烦了,懂一个是不行的,必须两个都用,所以R和Python语言你必须都精通,否则非常影响项目的数据分析进展。
我也是最先接触Python的,但后面就专心与R,他们语法存在一定的混淆和冲突,所以我只能放弃一个。经过整个博士的训练,我自认为已经精通R了,没有任何问题能把我难倒,Debug小王子。
但现在我不得不捡起Python,因为Scanpy是在是不得不用,以下就记录一些Python中对应的R的核心功能,以便实时查阅。
Seurat对象转Scanpy对象h5ad
【只能导出一个layer,RNA或者ATAC,好处就是metadata都在】
library(sceasy) library(reticulate) sceasy::convertFormat(seuset.flt.allen.D21, from="seurat", to="anndata", assay = "RNA", outFile='keyRdata/seuset.flt.allen.D21.RNA.h5ad')
Scanpy读取h5ad
adata_ref = sc.read_h5ad(os.path.join(work_dir, '/home/zz950/projects/ApcKO_multiomics/keyRdata/seuset.flt.allen.D21.RNA.h5ad'))
Seurat读取h5ad
【不要用SeuratDisk的LoadH5Seurat,就用最原始的anndata,只需要count matrix和metadata即可】
library("Seurat") library("anndata") data <- read_h5ad("Kang_2022_Stomach_Reference.h5ad") stomach.ref <- CreateSeuratObject(counts = t(data$X), meta.data = data$obs) print(str(stomach.ref))
Scanpy的数据结构
adata.var adata.obs adata.X adata.raw
Scanpy基本操作
UMAP改颜色
import matplotlib as mpl sc.pl.umap(adata, color=['Sox9', 'Ly6a', 'Tacstd2'], palette="Set2", color_map=mpl.cm.Reds)
import seaborn as sns blue = sns.color_palette('light:blue', as_cmap = True)
Continuous color schemes are given with the color_map argument, categorical schemes are given with palette. All the scatter plots (scatter, pca, tsne, umap, etc...) share these arguments.
Scanpy obs metadata操作
- 创建一个新的df
- 变换cellName
- 行或列取子集
- 按行或列合并两个df
- 某一列的字符串split
- 取两个vector交集
创建一个新的df
import pandas as pd ref_df = pd.DataFrame(index=a) ref_df["rawName"] = b # or d = {'col1': [1, 2], 'col2': [3, 4]} df = pd.DataFrame(data=d, index=a)
按行取子集
adata = adata[:, var_names]
按列取子集
类似seurat和R里的%in%函数,非常常用
adata_subset = adata[adata.obs['celltype'].isin(['a', 'b'])]
按行合并两个df
类似R里的cbind,按索引合并
merged_df = adata.obs.merge(ref_anno, left_index=True, right_index=True)
按列拼装两个df
类似R里的rbind
df1.append(df2)
某一列的字符串split
类似R里的strsplit函数,提取自己需要的信息 【这个python比R的语法简单】
[i.split("-")[0] for i in adata_ref.obs.index]
取两个vector交集
var_names = adata_ref.var_names.intersection(adata.var_names)
元素计数,类似R的table函数
pd.value_counts(gene_sets.term)
human和mouse基因大小转换
fetal_genes[0].str.upper().values