整齐的数据是Hadley Wickham (Wickham 2014)主要定义的概念。整齐的数据具有以下三个特征:
每个变量都有自己的列。每个观察值都有自己的行。每个值都有自己的单元格。以下是一些整齐数据的示例:
## Students Subject Years Score ## 1 Mark Maths 1 5 ## 2 Jane Biology 2 6 ## 3 Mohammed Physics 3 4 ## 4 Tom Maths 2 7 ## 5 Celia Computing 3 9以下是一些不整齐数据的示例:
## Students Sport Category Counts ## 1 Matt Tennis Wins 0 ## 2 Matt Tennis Losses 1 ## 3 Ellie Rugby Wins 3 ## 4 Ellie Rugby Losses 2 ## 5 Tim Football Wins 1 ## 6 Tim Football Losses 4 ## 7 Louise Swimming Wins 2 ## 8 Louise Swimming Losses 2 ## 9 Kelly Running Wins 5 ## 10 Kelly Running Losses 1任务1:不整齐的数据在哪些方面不整洁?我们怎么能把不整齐的数据整理整齐?
整齐的数据通常比不整齐的数据更容易使用,特别是如果您正在使用ggplot等软件包。幸运的是,可以使用软件包来整理不整齐的数据。今天我们将探讨tidyr包中可用的一些功能,这些功能可用于使不整齐的数据变得整齐。如果您有兴趣了解有关整理数据的更多信息,我们建议您阅读Garrett Grolemund和Hadley Wickham撰写的“R for Data Science”。电子版可在此处获取:http://r4ds.had.co.nz/
上面的不整齐数据是不整齐的,因为两个变量(Wins和Losses)存储在一列(Category)中。这是数据不整齐的常见方式。为了整理这些数据,我们需要制作Wins和Losses插入列,并将值存储Counts在这些列中。幸运的是,tidyverse包中有一个函数来执行此操作。该函数叫spread,它需要两个参数,key和value。您应该将包含多个变量的列的名称传递给key,并将包含多个变量值的列的名称传递给value。例如:
library(tidyverse) sports<-data.frame(Students=c("Matt", "Matt", "Ellie", "Ellie", "Tim", "Tim", "Louise", "Louise", "Kelly", "Kelly"), Sport=c("Tennis","Tennis", "Rugby", "Rugby","Football", "Football","Swimming","Swimming", "Running", "Running"), Category=c("Wins", "Losses", "Wins", "Losses", "Wins", "Losses", "Wins", "Losses", "Wins", "Losses"), Counts=c(0,1,3,2,1,4,2,2,5,1)) sports## Students Sport Category Counts ## 1 Matt Tennis Wins 0 ## 2 Matt Tennis Losses 1 ## 3 Ellie Rugby Wins 3 ## 4 Ellie Rugby Losses 2 ## 5 Tim Football Wins 1 ## 6 Tim Football Losses 4 ## 7 Louise Swimming Wins 2 ## 8 Louise Swimming Losses 2 ## 9 Kelly Running Wins 5 ## 10 Kelly Running Losses 1spread(sports, key=Category, value=Counts)## Students Sport Losses Wins ## 1 Ellie Rugby 2 3 ## 2 Kelly Running 1 5 ## 3 Louise Swimming 2 2 ## 4 Matt Tennis 1 0 ## 5 Tim Football 4 1任务2:下面foods定义的数据框不整齐。弄清楚原因并用spread()它来整理它
foods<-data.frame(student=c("Antoinette","Antoinette","Taylor", "Taylor", "Alexa", "Alexa"), Category=c("Dinner", "Dessert", "Dinner", "Dessert", "Dinner","Dessert"), Frequency=c(3,1,4,5,2,1))数据可能不整齐的另一种常见方式是列是值而不是变量。例如,下面的数据框显示了一些学生在5月和6月的测试中获得的百分比。数据是不整洁的,因为列May和June是值,而不是变量。
percentages<-data.frame(student=c("Alejandro", "Pietro", "Jane"), "May"=c(90,12,45), "June"=c(80,30,100))幸运的是,tidyverse包中还有一个函数来处理这个问题。gather()获取名称是值的列,key和valueas为两个参数。这次key是变量的名称,其值为列名,而value是值的名称,其值分布在多个列上。即:
gather(percentages, "May", "June", key="Month", value = "Percentage")## student Month Percentage ## 1 Alejandro May 90 ## 2 Pietro May 12 ## 3 Jane May 45 ## 4 Alejandro June 80 ## 5 Pietro June 30 ## 6 Jane June 100这些例子与单细胞RNA-seq分析没有多大关系,但旨在帮助说明整齐和不整齐数据的特征。如果您的数据以整齐的格式存储,您会发现分析单细胞RNA-seq数据要容易得多。幸运的是,我们通常用于促进单细胞RNA-seq分析的数据结构通常鼓励以整齐的方式存储您的数据。
5.6.2什么是Rich Data?如果你谷歌“rich data”,你会发现这个术语有很多不同的定义。在本课程中,我们将使用“丰富数据”来表示通过组合来自多个来源的信息生成的数据。例如,您可以通过在R中创建一个对象来生成丰富的数据,该对象包含单细胞RNA-seq实验中细胞中基因表达值的矩阵,还有关于如何进行实验的信息。我们将在下面讨论的SingleCellExperiment类是丰富数据的一个示例。
5.7
Bioconductor , SingleCellExperiment and scater
5.7.1 Bioconductor来自维基百科:Bioconductor是一个免费的,开源的开放式开发软件项目,用于分析和理解分子生物学中湿实验室实验产生的基因组数据。Bioconductor主要基于统计R编程语言,但确实包含其他编程语言的贡献。它每年有两个版本,遵循R的半年版本。在任何时候都有一个发布版本,对应于R的发布版本,以及一个对应于R的开发版本的开发版本。大多数用户将找到适合他们需求的发布版本。
我们强烈建议所有新手,甚至经验丰富的高通量数据分析师使用完善和维护的Bioconductor方法和类。
5.7.2 SingleCellExperiment类SingleCellExperiment(SCE)是用于存储来自单细胞实验的数据的S4类。这包括存储和检索spike-in信息的专门方法,每个细胞的降维坐标和尺寸因子,以及基因和文库的常用元数据。
实际上,可以使用其构造函数创建此类的对象:
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): ## spikeNames(0):在SingleCellExperiment中,用户可以为测定条目指定任意名称。为了协助软件包之间的互操作性,作者提供了针对特定类型数据的名称的一些建议:
计数:原始计数数据,例如特定基因的读数或转录物数。normcounts:与原始计数相同的标准化值。例如,计数除以以单位为中心的特定于细胞的大小因子。logcounts:日志转换计数或类似计数的值。在大多数情况下,这将被定义为对数转换的范数,例如,使用log base 2和伪计数1。cpm:每百万计数。这是每个细胞中每个基因的读数,除以每个细胞的文库大小(以百万计)。tpm:每百万的转录本。这是每个细胞中每个基因的转录物数量除以该细胞中转录物的总数(以百万计)。这些建议名称中的每一个都具有适当的getter / setter方法,以便于操作SingleCellExperiment。例如,我们可以使用(非常具体命名的)counts,对其进行标准化并将其分配给normcounts:normcounts(sce) <- log2(counts(sce) + 1) sce## class: SingleCellExperiment ## dim: 10 10 ## metadata(0): ## assays(2): counts normcounts ## rownames(10): gene1 gene2 ... gene9 gene10 ## rowData names(1): gene_names ## colnames(10): cell1 cell2 ... cell9 cell10 ## colData names(1): cell_names ## reducedDimNames(0): ## spikeNames(0):dim(normcounts(sce))## [1] 10 10head(normcounts(sce))## cell1 cell2 cell3 cell4 cell5 cell6 cell7 ## gene1 3.169925 3.169925 2.000000 2.584963 2.584963 3.321928 3.584963 ## gene2 3.459432 1.584963 3.584963 3.807355 3.700440 3.700440 3.000000 ## gene3 3.000000 3.169925 3.807355 3.169925 3.321928 3.321928 3.321928 ## gene4 3.584963 3.459432 3.000000 3.807355 3.700440 3.700440 3.700440 ## gene5 3.906891 3.000000 3.169925 3.321928 3.584963 3.459432 3.807355 ## gene6 3.700440 3.700440 3.584963 4.000000 3.169925 3.000000 3.459432 ## cell8 cell9 cell10 ## gene1 3.321928 3.807355 2.807355 ## gene2 3.807355 3.700440 4.000000 ## gene3 2.584963 4.000000 3.700440 ## gene4 3.169925 3.584963 3.700440 ## gene5 3.807355 2.584963 3.584963 ## gene6 3.321928 3.459432 4.0000005.7.3 scater包scater是用于单细胞RNA-seq分析的R包(McCarthy等人,2017)。该软件包含几种有用的方法,用于在进一步下游分析之前对数据进行质量控制,可视化和预处理。
scater 具有以下功能:
自动计算QC指标来自具有伪比对的read数据的转录物量化数据格式标准化丰富的探索性可视化分析无缝集成到Bioconductor宇宙中简单的规范化的方法我们强烈建议scater用于所有单细胞RNA-seq分析,并且scater是课程第一部分的基础。如下图所示,scater将帮助您在比对后对表达式矩阵进行质量控制,过滤和规范化。请记住,此图表示scater使用SCESet类的原始版本。在最新版本中,这个数字仍然是正确的,除了SCESet可以用SingleCellExperiment类代替。
---来自腾讯云社区的---生信技能树jimmy
微信扫一扫打赏
支付宝扫一扫打赏