3.10 S4對象
S3系統(tǒng)允許創(chuàng)建行為依賴于其第一個參數(shù)的類的函數(shù)溶诞,但不考慮其他參數(shù)很澄。另外颜及,S3不允許自定義數(shù)據(jù)結(jié)構(gòu)俏站,S3系統(tǒng)中使用的變量是單一類型向量或列表痊土。S4系統(tǒng)可以解決這些問題。S4系統(tǒng)與S3的主要區(qū)別在于犯祠,在S4中每個類都有正式定義衡载,描述該類的對象中存儲了什么數(shù)據(jù)(在S3中您可以將任何類分配給任何變量)。數(shù)據(jù)存儲在具有名稱和指定類型的插槽(slots)中弃榨,需要指定插槽來創(chuàng)建新類梨睁。
現(xiàn)在我們可以創(chuàng)建此類的變量:
> setClass("Person",
slots = c(
name = "character",
age = "numeric"
)
)
> john = new("Person", name = "John Smith", age = 30)
> class(john)
[1] "Person"
attr(,"package")
[1] ".GlobalEnv"
> typeof(john)
[1] "S4"
> john
An object of class "Person"
Slot "name":
[1] "John Smith"
Slot "age":
[1] 30
通常坡贺,槽可以通過特定函數(shù)訪問和修改。對于我們上面指定的Person類钧萍,可以使用函數(shù)name
訪問name风瘦。但是R允許使用運算符@
直接訪問插槽:
> john@name
[1] "John Smith"
> slotNames(john)
[1] "name" "age"
> slot(john,'age')
[1] 30
> john@age
[1] 30
3.11 更多信息
可以在交互式會話中輸入?function
來獲取與這些數(shù)據(jù)類型相關(guān)的任何R命令的更多信息公般。
3.12 整潔數(shù)據(jù)(Tidy Data)
3.12.1 什么是整潔數(shù)據(jù)
整潔數(shù)據(jù)是一個由Hadley Wickham(Wickham, 2014)定義的概念官帘。整潔數(shù)據(jù)具有以下三個特征:
- 每列代表一個變量。
- 每行代表一個觀測酗捌。
- 每個單元格代表一個值涌哲。
以下是一些整潔數(shù)據(jù)的示例:
> data.frame(Students=c("Mark", "Jane", "Mohammed", "Tom", "Celia"),
Subject=c("Maths", "Biology", "Physics", "Maths", "Computing"),
Years=c(1,2,3,2,3),
Score=c(5,6,4,7,9))
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
以下是一些混亂數(shù)據(jù)的示例:
> 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))
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
任務(wù)1:雜亂的數(shù)據(jù)在哪些方面是不整潔的哪廓?我們?nèi)绾尾拍苁闺s亂的數(shù)據(jù)變得整潔初烘?
整潔的數(shù)據(jù)通常比不整潔的數(shù)據(jù)更容易處理,特別是如果你使用諸如ggplot
之類的包哆料。幸運的是东亦,有包可以讓不整潔的數(shù)據(jù)變得整潔。今天拢锹,我們將探討tidyr
包中的幾個可用函數(shù)萄喳,這些函數(shù)可用于整理雜亂的數(shù)據(jù)他巨。如果你有興趣了解更多關(guān)于整理數(shù)據(jù)的信息,我們推薦你閱讀Garrett Grolemund和Hadley Wickham合著的《R for Data Science》捻爷。電子版可在此處獲纫查:http://r4ds.had.co.nz/司志。
上面的雜亂數(shù)據(jù)之所以雜亂,是因為兩個變量(Wins
和Losses
)存儲在一列(Category
)中囚霸。這是數(shù)據(jù)雜亂的常見原因拓型。為了整理這些數(shù)據(jù)瘸恼,我們需要將Wins
和Losses
分成列钞脂,并將Counts
中的值存儲在這些列中。tidyverse
包中有一個函數(shù)可以執(zhí)行此操作邓夕。該函數(shù)名為spread
阎毅,它接受兩個參數(shù)扇调,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 1
> spread(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
任務(wù)2:下面定義的數(shù)據(jù)框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))
數(shù)據(jù)混亂的另一種常見情況是列是值而不是變量季俩。例如,下面的數(shù)據(jù)框顯示了一些學(xué)生在5月和6月的測試中獲得的百分比店归。數(shù)據(jù)很混亂娱节,因為5月和6月的列是值祭示,而不是變量质涛。
percentages<-data.frame(student=c("Alejandro", "Pietro", "Jane"),
"May"=c(90,12,45),
"June"=c(80,30,100))
tidyverse
包中有一個函數(shù)可以解決這個問題。gather()
將列的名稱怒炸、key
和value
作為參數(shù)阅羹。這一次,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分析沒有太大關(guān)系看尼,但旨在幫助說明整潔和不整潔數(shù)據(jù)的特征藏斩。如果您的數(shù)據(jù)以整潔的格式存儲,您會發(fā)現(xiàn)分析單細胞RNA-seq數(shù)據(jù)變得更加容易窜觉。幸運的是禀挫,我們通常用于單細胞RNA-seq分析的數(shù)據(jù)結(jié)構(gòu)鼓勵以整潔的方式存儲數(shù)據(jù)拓颓。
3.12.2 什么是Rich Data
如果你在Google上搜索“Rich Data”,你會發(fā)現(xiàn)這個術(shù)語有很多不同的定義砰左。在本課程中缠导,我們將使用“Rich Data”來表示通過組合來自多個來源的信息而生成的數(shù)據(jù)溉痢。例如孩饼,您可以通過在R中創(chuàng)建一個對象來制作Rich Data,該對象包含單細胞RNA測序?qū)嶒炛锌缂毎幕虮磉_矩陣立膛,還包含有關(guān)如何進行實驗的信息宝泵。我們將在下面討論的SingleCellExperiment類的對象就是Rich Data的一個例子。
3.12.3 SingleCellExperiment
類
SingleCellExperiment
(SCE)是一個S4類坎怪,用于存儲單細胞實驗的數(shù)據(jù)。這包括用于存儲和檢索峰值信息嘁酿、每個細胞的降維坐標和尺度因子以及基因和文庫的常用元數(shù)據(jù)的專門方法闹司。
可以使用其構(gòu)造函數(shù)創(chuàng)建此類的對象:
> 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):
altExpNames(0):
在SingleCellExperiment
中游桩,用戶可以為檢測條目分配任意名稱借卧。為了協(xié)助包之間的互操作性,作者對特定類型數(shù)據(jù)的名稱提供了一些建議:
- counts:原始計數(shù)數(shù)據(jù)陪每,例如特定基因的read數(shù)或轉(zhuǎn)錄本數(shù)檩禾。
- normcounts:與原始計數(shù)具有相同尺度的標準化值疤祭。例如勺馆,計數(shù)除以以1為中心的細胞特異尺度因子。
- logcounts:對數(shù)轉(zhuǎn)換計數(shù)或類似計數(shù)的值蜈项。在大多數(shù)情況下续挟,定義為對數(shù)轉(zhuǎn)換的normcounts诗祸,例如,使用以2為底的對數(shù)和偽計數(shù)1博个。
- cpm:每百萬計數(shù)盆佣。這是每個細胞中每個基因的read計數(shù),除以每個細胞的文庫大新腔摇(以百萬為單位)穆咐。
- tpm:每百萬轉(zhuǎn)錄本數(shù)字旭。這是每個細胞中每個基因的轉(zhuǎn)錄本數(shù)除以該細胞中的轉(zhuǎn)錄本總數(shù)(以百萬為單位)。
每個建議的名稱都有一個適當(dāng)?shù)脑L問/修改方法拍柒,以方便操作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):
altExpNames(0):
> dim(normcounts(sce))
[1] 10 10
> head(normcounts(sce))
cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8
gene1 2.584963 3.321928 3.906891 3.584963 3.807355 2.807355 3.807355 3.584963
gene2 3.584963 3.459432 4.392317 3.584963 2.321928 3.459432 3.169925 3.000000
gene3 3.700440 3.807355 4.087463 3.700440 3.000000 3.459432 3.000000 3.169925
gene4 3.459432 3.321928 3.459432 3.000000 3.584963 3.584963 3.169925 3.906891
gene5 3.321928 3.459432 2.807355 4.000000 3.321928 3.584963 3.321928 3.807355
gene6 3.584963 2.000000 3.584963 3.584963 3.169925 3.459432 2.807355 3.700440
cell9 cell10
gene1 3.584963 3.321928
gene2 3.584963 3.321928
gene3 3.584963 2.321928
gene4 3.584963 3.700440
gene5 3.584963 2.807355
gene6 3.459432 2.584963
3.12.4 scater
包
scater
是一個用于單細胞RNA測序分析的R包(McCarthy等肮之,2017)卜录。該軟件包包含幾種有用的方法,用于進一步下游分析之前的質(zhì)量控制筐高、可視化和數(shù)據(jù)預(yù)處理柑土。
scater
具有以下功能:
- 自動計算QC指標
- 使用偽比對對read數(shù)據(jù)進行轉(zhuǎn)錄本定量
- 數(shù)據(jù)格式標準化
- 豐富的可視化功能,可用于探索性分析
- 無縫集成到Bioconductor
- 簡單的標準化方法
我們強烈建議所有單細胞RNA-seq分析都使用scater
扮宠,scater
是本課程第一部分的基礎(chǔ)坛增。
如下圖所示荒叼,scater
將幫助您對表達矩陣進行質(zhì)量控制被廓、過濾和標準化萝玷。請記住球碉,此圖代表了scater
的原始版本睁冬,其中使用了SCESet
類。在最新版本中直奋,此圖仍然正確脚线,只是SCESet
可以用SingleCellExperiment
類替代弥搞。
往期內(nèi)容:
重生之我在劍橋大學(xué)學(xué)習(xí)單細胞RNA-seq分析——2. scRNA-Seq原始測序數(shù)據(jù)處理(1)
重生之我在劍橋大學(xué)學(xué)習(xí)單細胞RNA-seq分析——2. scRNA-Seq原始測序數(shù)據(jù)處理(2)
重生之我在劍橋大學(xué)學(xué)習(xí)單細胞RNA-seq分析——3. 單細胞分析中的R/Bioconductor簡介(1)
重生之我在劍橋大學(xué)學(xué)習(xí)單細胞RNA-seq分析——3. 單細胞分析中的R/Bioconductor簡介(2)