重生之我在劍橋大學(xué)學(xué)習(xí)單細胞RNA-seq分析——3. 單細胞分析中的R/Bioconductor簡介(3)

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ù)具有以下三個特征:

  1. 每列代表一個變量。
  2. 每行代表一個觀測酗捌。
  3. 每個單元格代表一個值涌哲。

以下是一些整潔數(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ù)之所以雜亂,是因為兩個變量(WinsLosses)存儲在一列(Category)中囚霸。這是數(shù)據(jù)雜亂的常見原因拓型。為了整理這些數(shù)據(jù)瘸恼,我們需要將WinsLosses分成列钞脂,并將Counts中的值存儲在這些列中。tidyverse包中有一個函數(shù)可以執(zhí)行此操作邓夕。該函數(shù)名為spread阎毅,它接受兩個參數(shù)扇调,keyvalue。將包含多個變量的列的名稱傳遞給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()將列的名稱怒炸、keyvalue作為參數(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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末船逮,一起剝皮案震驚了整個濱河市挖胃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伪煤,老刑警劉巖抱既,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件防泵,死亡現(xiàn)場離奇詭異捷泞,居然都是意外死亡寿谴,警方通過查閱死者的電腦和手機讶泰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門咏瑟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痪署,你說我怎么就攤上這事码泞。” “怎么了狼犯?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵余寥,是天一觀的道長。 經(jīng)常有香客問我悯森,道長宋舷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任肥缔,我火速辦了婚禮,結(jié)果婚禮上汹来,老公的妹妹穿的比我還像新娘续膳。我一直安慰自己,他們只是感情好收班,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布坟岔。 她就那樣靜靜地躺著,像睡著了一般摔桦。 火紅的嫁衣襯著肌膚如雪社付。 梳的紋絲不亂的頭發(fā)上承疲,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音鸥咖,去河邊找鬼燕鸽。 笑死,一個胖子當(dāng)著我的面吹牛啼辣,可吹牛的內(nèi)容都是我干的啊研。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸥拧,長吁一口氣:“原來是場噩夢啊……” “哼党远!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起富弦,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沟娱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腕柜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體济似,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年媳握,在試婚紗的時候發(fā)現(xiàn)自己被綠了碱屁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛾找,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赵誓,到底是詐尸還是另有隱情打毛,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布俩功,位于F島的核電站幻枉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诡蜓。R本人自食惡果不足惜熬甫,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔓罚。 院中可真熱鬧椿肩,春花似錦、人聲如沸豺谈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茬末。三九已至厂榛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背击奶。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工辈双, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柜砾。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓湃望,卻偏偏與公主長得像,于是被迫代替她去往敵國和親局义。 傳聞我的和親對象是個殘疾皇子喜爷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容