cytof数据处理难点之修改FCS文件

前面我们已经完成了cytof数据处理的主要步骤,读入文件,质量控制,降维聚类分群,生物学注释和细胞亚群比例差异分析。 目录如下:

其实跟纯粹的单细胞转录组就非常类似了,不过单细胞转录组数据分析的细节以及背景我就不赘述了,看我在《单细胞天地》的单细胞基础10讲:

以及各式各样的个性化汇总教程,差不多就明白了。

基本流程走完了,仅仅是万里长征第一步而已。我们可以开始尝试分析一些文献的公共数据集啦,不过在处理那些数据的过程中,我们还需要传授给大家几个小技巧。

修改FCS文件

FCS文件类型,流式细胞术数据文件标准。流式细胞术数据文件标准于1984年发布,以促进流式细胞术数据分析软件与在不同类型的流式细胞术仪器上获取的数据的互操作性。

该标准在1990年修订为FCS 2.0,在1997年修订为FCS 3.0,在2010年修订为FCS 3.1。

2020年9月3日Spidlen J等人在Cytometry A杂志上提出了FCS 3.2,该修订版满足了一些新需求和建议,并结合了十年来整个细胞仪领域的进步。

FCS 3.2规范完整版可以下载http://flowcyt.sf.net/fcs/fcs32.pdf

为什么要修改它呢?

因为有可能是你的同一个实验项目的多个FCS文件,它们的抗体顺序并不一致。

读取fcs文件的函数来自于 flowCore 包

我们读取fcs文件,可以读取一个文件夹下面的全部fcs文件,或者单个fcs文件独立读取。

代码如下:

p1='files'
fs1=list.files(p1,'*fcs' )
fs1
# 可以读取一个文件夹下面的全部fcs文件
samp <- read.flowSet(files = fs1,path = p1)

# 或者单个fcs文件独立读取
cytof_list <- lapply(fs1, function(x){
 read.flowSet(files = x ,path = p1) 
}) 
cytof_list
lapply(cytof_list,colnames)
lapply(cytof_list,function(x) dim(x[[1]]@exprs))
# 具体看每一个fcs文件 
tmp=cytof_list[[1]][[1]]
dim(tmp@exprs) 
tmp@parameters@data

首先需要明白读取fcs文件的函数来自于 flowCore 包:

read.flowSet {flowCore} ## 批量读取文件夹下面的全部fcs文件
read.FCS {flowCore} ## 单个fcs读取

简单的思考,既然是有read.FCS可以猜出应该是有 write.FCS {flowCore}

修改flowFrame-class

使用read.FCS {flowCore} 读取fcs文件后是一个 flowFrame-class,需要修改它就得先理解它:

This class represents the data contained in a FCS file or similar data structure. There are three parts of the data:
a numeric matrix of the raw measurement values with rows=events and columns=parameters
annotation for the parameters (e.g., the measurement channels, stains, dynamic range)
additional annotation provided through keywords in the FCS file

构建它的代码是:

new("flowFrame",
exprs = ...., Object of class matrix
parameters = ...., Object of class AnnotatedDataFrame
description = ...., Object of class list
)

最终代码如下:

ids=table(unlist(lapply(cytof_list,colnames)))
id=names(ids[ids==8])
id
dir.create('new')
fs=list.files('old',pattern = '*fcs')
fs
lapply(fs, function(x){
 tmp=read.FCS(file.path('old',x))
 tmp@exprs=tmp@exprs[,id]
 tmp@parameters@data=tmp@parameters@data[match(id,tmp@parameters@data$name ),]
 write.FCS(tmp,file.path('new',x))
})
p1='new'
fs1=list.files(p1,'*fcs' )
fs1
samp <- read.flowSet(files = fs1,path = p1)

Comments are closed.