Seurat-Scanpy互通 | R-Python互通

发布时间 2023-08-15 04:51:01作者: Life·Intelligence

 

单细胞数据分析发展到现在,已经分化为两大阵营,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 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)