背景
上次的笔记中,我们详细介绍了Seurat 的标准流程还有一些可视化的方法。
其实我个人一直以来使用的都是V4版本,不过好在V4和V5在数据结构方面的变动并不显著,所以前面的两篇笔记是按照更新后的V5版本来写的。因此,已经熟悉V4的小伙伴们也不用担心,我在第一篇笔记里面已经给出把V5降成V4的办法,直接照搬就行。
在Seurat处理数据集期间的数据结构变化之前,我们要先学习一些基础知识。因为读取数据、认识数据结构、指定变量是所有数据分析的基础。
01 基础数据类型
数据集是由数据构成的一个矩形数组,通常行表示观测(例如用于表示年龄大小的数字、用于表示性别的男女),列表示变量(例如年龄、性别)。
R语言中有许多用于储存数据的结构,包括向量(vector)、矩阵(matrix)、数组(array)、数据框(data frame)和列表(list)。
我们来尝试一下创建不同的数据结构:
1. 向量
R语言中最基础的数据格式,向量。向量是用于储存数值型、字符型、逻辑型数据的一维的数组。使用函数c( )可以创建向量,比如:
用过Rstudio的大家都知道,Rstudio界面分为四部分,我们这次主要用到的是它的右上角这一块内容,这里会标一个Environment的字样,这个框里面显示的就是当前R会话中加载的数据、变量和函数等信息,并且在运行的过程中这个信息会不断地变换。
运行以后在environment当中就会出现以下被定义好的向量。其中a是数值型向量(number),b是字符型向量(character),c则是逻辑型向量(logic),d是矩阵,e是复数,f是列表。
使用class函数我们可以直接查看数据的类型:
(比起向量,其实还有一种更加基础的数据格式,即标量。标量是只含有一个元素的向量,用于储存常量,例如f <- 3、h <- TRUE。)
2. 矩阵
矩阵是一个二维的数组,可以通过函数matrix( )创建矩阵,在这里我用R语言实战中的代码来进行演示,首先来看看标准格式:
vector表示矩阵中的变量;nrow和ncol用来指定行和列的数目;dimnames是可选项,可以用来通过字符型变量来给行和列命名;byrow同样是可选项,用来选择是按行填充(byrow=TRUE) 还是按列填充(byrow=TRUE) 。
接下来我们来看一下创建矩阵的实例:
3. 数组
数组的内容和矩阵很像,但是维度可以大于2。数组可以通过array函数创建,基本格式如下:
vector表示数组中的变量;dimensions是一个数值型向量,表示每个维度的最大值;dimnames是可选项,与矩阵类似,表示每个维度的命名。
接下来是创建数组的实例:
4. 数据框
一个矩阵、数组只能储存一种类型的变量。由于数据框可以同时包含多种类型(数值型、字符型等)的变量,它将是R语言中最常见的数据结构。可以用函数data.frame( )创建,基本格式如下:
其中col1、col2、col3表示数据框的第一二三列,可以是任何类型的变量(字符型、数值型、逻辑型)。
接下来是创建数据框的实例:
5. 列表
列表是作为复杂的一种数据类型,可以储存刚才讲到的任何一种数据结构。如下:
先简单认识一下R语言的基础知识、数据类型,有了上面的这些知识,我们就可以去回顾前两篇笔记里的PBMC数据了。
注意,以上内容用到的大部分代码都可以在《R语言实战》一书的作者所创建的网站www.manning.com上找到。
02 加载数据
我们先参照之前篇笔记的代码把数据加载好,然后创建Seurat对象。
加载了10X的矩阵数据后,可以看到,整个数据大小是29.9M。这里对它的描述是Large dgCMatrix,是R中用于存储和操作大型矩阵的数据结构。
可以看到,pbmc.data一共包含6个部分(我们称之为插槽),分别是:i,p,Dim,Dimnames,x 和 factors。
03 认识数据
i: 这个 i 可以使用pbmc.data@i来调用查看,因为全部展示在文章里面太占位置了,因此我们使用head只展示前100个元素。
根据我们的第一篇笔记,就可以知道这个i代表的是所有细胞当中有表达的基因的数量。
p: p 可以使用pbmc.data@p调用,但是同样只展示前100个。
似乎并不能看出来它代表的是什么信息,虽然已知的是我们的数据集一共有2700个细胞,加上这里还有一个0,正好是2701个元素。
再来看看最后的100个元素确认一下。
可以看到最后一个数值刚好是2286884,即所有细胞当中有表达的基因的数量。那么从0开始,到2286884结束,这个p代表的就是每个细胞中表达的基因数逐个累加而形成的数值。
Dim: 通过pbmc.data@Dim调用,可以看到这个列表信息很简单,就两个元素32738和2700,一个基因数,一个细胞数。
Dimnames: 可通过pbmc.data@Dimnames调用。environment里面对它的描述是“List of 2”,也就是两个列表。
可以看出这两个列表分别是基因信息列表和代表细胞的barcodes信息列表。
x: 通过pbmc.data@x调用。里面存储的是代表每个基因表达量的UMI计数。
factors:也是通过pbmc.data@factors来调用,但之前从environment里面已经能看出来,它现在还只是一个空的list。
@factors插槽是用来存储与矩阵行或列相关的分类变量的。例如,如果我们有一个病人的年龄或性别这样的信息,并且想把这些信息与矩阵的行或列联系起来,我们可以用因子(factors)来表示这些分类变量。
但现在@factors 插槽显示list() 表示这个列表是空的,也就是说当前没有这样的信息被存储在这个矩阵中,这是正常的。
到此为止,该外周血单个核细胞(PBMC)数据集的结构信息就讲完了。我们下一次就来看看在对这个数据集创建Seurat以后,那些数据分析的标准流程会对数据结构产生什么样的影响吧。
https://images.app.goo.gl/TYWBEMsxaTTZMwHn8
往期文章推荐
详解单细胞分析基础流程(一):标准分析
手把手教学|单细胞分析基础流程(二):Seurat数据可视化
经验总结|生物信息学的学习方法