• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

single-cell RNA-seq-Course学习之R语言数据类型

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

chapter 5 introduction to R

5.3 Data-types/classes

5.3.1 Numeric(数字)

可以通过class函数查看数据的类型:

如:y=42                   class(y)       输出:numeric

 y=as.integer(42)         class(y)            输出:integer

当然,改变类型与原类性不符的时候, 将会报错:

as.numeric("h")           输出:warning

5.3.2 Character/String(字符/字符串)

       “character”类存储各种文本数据。 编程约定将包含多个字母的数据称为“字符串”,因此大多数作用于字符数据的R函数将数据称为“字符串”,并且通常在其名称中包含“str”或“string”。 字符串通过双引号标识,而变量/函数名称不是:

x=5          a=“x”    # character “x”          a                                输出:“x”

b=x         #  variable x         b                       输出:5

       除了标准的字母数字字符外,字符串还可以存储各种特殊字符。 使用间隙后跟单个字符来识别特殊字符,最相关的是tab的特殊字符:\ t和换行:\ n。 为了演示这些特殊字符,可以将两个字符串连接起来(cat),这些字符分隔(sep)它们:

cat(“hello”,“world”,sep=“ ”)                               输出:hello world

cat("Hello", "World", sep= "\t")                                   输出:Hello         World

 cat("Hello", "World", sep= "\n")                                 输出:Hello

                                                                                             World

       请注意,特殊字符在不同的功能中有不同的作 例如,粘贴功能与cat的功能相同,但不识别特殊字符。

paste("Hello", "World", sep= "\n")                               输出:"Hello\nWorld"

       单反斜杠或双反斜杠也可用作转义字符来关闭特殊字符或允许引号包含在字符串中:

cat("This \"string\" contains quotation marks.")           输出:This "string" contains quotation marks.

       特殊字符通常仅用于模式匹配,以及将数据读取/写入文件。 例如,这是您将标签分隔文件读入R的方式。

dat = read.delim("file.tsv", sep="\t")

       另一种特殊类型的字符数据是颜色。 颜色可以通过三种主要方式指定:使用可用的名称,使用rgb功能的红色,绿色,蓝色值,以及使用色调(颜色),饱和度(颜色对白色)和值(颜色/白色对黑色)使用 hsv函数。 默认情况下,rgb和hsv期望0-1中有三个值,透明度可选的第四个值。 或者,可以从许多不同的包中加载具有有用属性的预定颜色组,其中RColorBrewer是最受欢迎的颜色之一。

reds = c("red", rgb(1,0,0), hsv(0, 1, 1))

barplot(c(1,1,1), col=reds, names=c("by_name", "by_rgb", "by_hsv"))        

5.3.3 Logical(逻辑值)

       逻辑类存储布尔真值,即TRUE和FALSE。 它用于存储逻辑运算的结果,条件语句将被强制转换为此类。 大多数其他数据类型可以强制转换为布尔值而不会触发(或“抛出”)错误消息,这可能会导致意外行为。

当输入TRUE,“T"和任何大于0的值,当其class强制转换成as.logical时,其class都会输出TRUE,其余为FALSE。

5.3.4 Factors(因子)

       字符串/字符数据存储效率非常低,每个字母通常需要与任何整数相同的内存量。 因此,当存储具有重复元素的字符串向量时,更有效地将每个元素分配给整数并将向量存储为整数和附加的字符串到整数关联表。 因此,默认情况下,R将读取数据表的文本列作为因子。

```{r}
str_vector = c("Apple", "Apple", "Banana", "Banana", "Banana", "Carrot", "Carrot", "Apple", "Banana")
class(str_vector)  # 载出原始数据类型
str_vector         # 输出原始数据
factored_vector = factor(str_vector)   # 转换类型 
class(factored_vector) # 输出转换后类型
factored_vector    # 输出转换后数据
```

[1] "character"
[1] "Apple"  "Apple"  "Banana" "Banana" "Banana" "Carrot"
[7] "Carrot" "Apple"  "Banana"
[1] "factor"
[1] Apple  Apple  Banana Banana Banana Carrot Carrot
[8] Apple  Banana
Levels: Apple Banana Carrot

       因素的双重性质可能导致一些不直观的行为。 例如。 将两个因素结合在一起会将它们转换为数字形式,原始字符串将丢失。

c(factored_vector, factored_vector)
## [1] 1 1 2 2 2 3 3 1 2 1 1 2 2 2 3 3 1 2

       同样,如果由于格式化问题,数字数据被错误地解释为字符串,那么在强制转换为数值之前必须将因子转换回字符串:

```{r}
x = c("20", "25", "23", "38", "20", "40", "25", "30")
x = factor(x)       # factor->numeric
as.numeric(x)       # error

as.numeric(as.character(x))  # factor->character->numeric
```
[1] 1 3 2 5 1 6 3 4
[1] 20 25 23 38 20 40 25 30

       要使R读取文本作为字符数据而不是因子设置环境选项stringsAsFactors = FALSE。这必须在每个R会话开始时完成

options(stringsAsFactors=FALSE)

5.3.5 Checking class/type(检查类性)

```{r}
x=1.4
is.numeric(x)
is.character(x)
is.logical(x)
is.factor(x)
```
[1] TRUE
[1] FALSE
[1] FALSE
[1] FALSE

5.4 Basic data structures(基本数据结构)       

        到目前为止,我们只关注单个值和向量。 向量是R中最简单的数据结构。它们是所有相同类型的一维数据数组。 如果创建向量时的输入具有不同类型,则它将被强制转换为与数据最一致的数据类型。

```{r}
x = c("Hello", 5, TRUE)
x
class(x)
```
[1] "Hello" "5"     "TRUE" 
[1] "character"

       在这里,我们尝试将字符,数字和逻辑数据放入单个向量中,以便将所有值强制转换为字符数据。
       矩阵是矢量的二维版本,它还要求所有数据具有相同的类型。 如果我们将字符向量和数字向量组合成矩阵,则所有数据都将被强制转换为字符:

```{r}
x = c("A", "B", "C")
y = c(1, 2, 3)
m = cbind(x,y)
m
class(m)
```
     x   y  
[1,] "A" "1"
[2,] "B" "2"
[3,] "C" "3"
[1] "matrix"

     引号表示数字向量已被强制转换为字符。 或者,要使用不同数据类型的列存储数据,我们可以使用dataframe。

z = data.frame(x, y)
z

##   x y
## 1 A 1
## 2 B 2
## 3 C 3

       如果你已经设置了stringsAsFactors = FALSE,你会发现第一列仍然是字符,否则它将自动转换为一个因子。

       矩阵和dataframe之间的另一个区别是能够使用$运算符选择列。

       最终的基本数据结构是列表。 列表允许将不同类型和不同长度的数据存储在单个对象中。 列表的每个元素可以是任何其他R对象:任何类型的数据,任何数据结构,甚至其他列表或函数。

l=list(m,z)       #列表的使用
l1 = list(sublist=l, a_matrix=m, numeric_value=42, this_string="Hello World", even_a_function=cbind)

       当从不适合任何先前数据结构的函数返回大量结果时,列表最常用。

5.6 Data Types(数据类型)

        整洁的数据是Hadley Wickham(Wickham,2014)主要定义的概念。 整洁的数据具有以下三个特征:

  1. 每个变量都有自己的列。
  2. 每个观察都有自己的行。
  3. 每个值都有自己的单元格。

       整洁的数据通常比不整齐的数据更容易使用,特别是如果您正在使用ggplot等软件包。 幸运的是,可以使用软件包来整理不整洁的数据。 今天我们将探讨tidyr包中可用的一些功能,这些功能可用于使不整洁的数据变得整洁。 如果您有兴趣了解有关整理数据的更多信息,我们建议您阅读Garrett Grolemund和Hadley Wickham撰写的“R for Data Science”。 电子版可在此处获取:http://r4ds.had.co.nz/

       上面的不整齐数据是不整洁的,因为两个变量(Wins和Loss)存储在一列(Category)中。 这是数据不整齐的常见方式。 为了整理这些数据,我们需要将Wins和Loss设置为列,并将值存储在这些列中的Counts中。 幸运的是,tidyverse包中有一个函数来执行此操作。 该函数称为spread,它有两个参数,key和value。 您应该将包含多个变量的列的名称传递给key,并将包含多个变量值的列的名称传递给value。 例如:

数据可能不整齐的另一种常见方式是列是值而不是变量。 例如,下面的数据框显示了一些学生在5月和6月的测试中获得的百分比。 数据不整齐,因为5月和6月的列是值,而不是变量。
幸运的是,tidyverse包中还有一个函数来处理这个问题。 gather()获取值的名称,键和值作为参数。 这一次,键是变量的名称,其值为列名,值是变量的名称,其值分布在多个列上。即:

       数据可能不整齐的另一种常见方式是列是值而不是变量。 例如,下面的数据框显示了一些学生在5月和6月的测试中获得的百分比。 数据不整齐,因为5月和6月的列是值,而不是变量。
幸运的是,tidyverse包中还有一个函数来处理这个问题。 gather()获取值的名称,键和值作为参数。 这一次,键是变量的名称,其值为列名,值是变量的名称,其值分布在多个列上。即:

```
```{r}
library(tidyverse)
percentages<-data.frame(student=c("Alejandro", "Pietro", "Jane"), "May"=c(90,12,45), "June"=c(80,30,100))
percentages
gathered_percentages<-gather(percentages, "May", "June", key="Month", value = "Percentage")
gathered_percentages
```
student    May   June
Alejandro   90    80		
Pietro	    12	  30		
Jane	    45	 100	


student    Month    Percentage
Alejandro   May     	90		
Pietro	    May	        12		
Jane     	May	        45		
Alejandro   June	    80		
Pietro	    June	    30		
Jane	    June	   100	

       这些例子与单细胞RNA-seq分析没有多大关系,但旨在帮助说明整洁和不整洁数据的特征。 如果您的数据以整齐的格式存储,您会发现分析单细胞RNA-seq数据要容易得多。 幸运的是,我们通常用于促进单细胞RNA-seq分析的数据结构通常鼓励以整齐的方式存储您的数据。

5.6.2 Rich Data

       如果你谷歌“丰富的数据”,你会发现这个术语有很多不同的定义。 在本课程中,我们将使用“丰富数据”来表示通过组合来自多个来源的信息生成的数据。 例如,您可以通过在R中创建一个对象来生成丰富的数据,该对象包含单细胞RNA-seq实验中细胞中基因表达值的矩阵,还有关于如何进行实验的信息。 我们将在下面讨论的SingleCellExperiment类的对象是丰富数据的示例。

5.6.2 Bioconductor

       来自维基百科:Bioconductor是一个免费的,开源的开放式开发软件项目,用于分析和理解分子生物学中湿实验室实验产生的基因组数据。 Bioconductor主要基于统计R编程语言,但确实包含其他编程语言的贡献。 它每年有两个版本,遵循R的半年版本。在任何时候都有一个发布版本,它对应于R的发布版本,以及一个开发版本,它对应于R的开发版本。大多数用户将 找到适合他们需求的发布版本。 我们强烈建议所有新人,甚至经验丰富的高通量数据分析师使用完善和维护的Bioconductor方法和类。

5.6.4 SingleCellExperiment class

       SingleCellExperiment(SCE)是用于存储来自单细胞实验的数据的S4类。 这包括存储和检索尖峰信息的专门方法,每个细胞的降维坐标和尺寸因子,以及基因和文库的常用元数据。

library(SingleCellExperiment)
counts <- matrix(rpois(100, lambda = 10), ncol=10, nrow=10)
rownames(counts) <- paste("gene", 1:10, sep = " ")
colnames(counts) <- paste("cell", 1:10, sep = " ")
sce <- SingleCellExperiment(
       assays = list(counts = counts),
       rowData = data.frame(gene_names = paste("gene_name", 1:10, sep = " ")),
       colData = data.frame(cell_names = paste("cell_name", 1:10, sep = " "))
)
sce

## class: SingleCellExperiment
## dim: 10 10
## metadata(0):
## assays(1): counts
## rownames(10): gene1 gene2 ... gene9 gene10
## rowData names(1): gene_names
## colnames(10): cell1 cell2 ... cell9 cell10
## colData names(1): cell_names
## reducedDimNames(0):

        在SingleCellExperiment中,用户可以为测定条目指定任意名称。 为了协助软件包之间的互操作性,作者提供了针对特定类型数据的名称的一些建议:

  • counts:原始计数数据,例如特定基因的读数或转录物数。
  • normcounts:与原始计数相同的标准化值。 例如,计数除以以单位为中心的特定于细胞的大小因子。
  • logcounts:日志转换计数或类似计数的值。 在大多数情况下,这将被定义为logtransformed normcounts,例如,使用log base 2和伪计数1。
  • cpm:每百万计数。 这是每个细胞中每个基因的读数,除以每个细胞的文库大小(以百万计)。
  • tpm:每百万的成绩单。 这是每个细胞中每个基因的转录物数量除以该细胞中转录物的总数(以百万计)。

       这些建议名称中的每一个都具有适当的getter / setter方法,以便于操作SingleCellExperiment。 例如,我们可以采用(非常具体命名的)计数槽,对其进行标准化并将其分配给normcounts:

5.7.3  scater package

       scater是用于单细胞RNA-seq分析的R包(McCarthy等,2017)。 该软件包包含几种有用的方法,用于在进一步下游分析之前对数据进行质量控制,可视化和预处理。

       scater具有以下功能:

  • 自动计算QC指标
  • 来自具有伪对齐的读取数据的转录物量化
  • 数据格式标准化
  • 丰富的探索性分析可视化
  • 无缝集成到Bioconductor世界中
  • 简单的规范化方法

       我们强烈建议使用scater进行所有单细胞RNA-seq分析,scater是课程第一部分的基础。
如下图所示,scater将帮助您在映射和对齐后对表达式矩阵进行质量控制,过滤和规范化。 请记住,此图表示使用SCESet类的scater的原始版本。 在最新版本中,此图仍然是正确的,除了SCESet可以用SingleCellExperiment类替换。

#先写到这儿⑧


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap