1.Tidy data原則
當(dāng)我們進(jìn)行數(shù)據(jù)整理時,同樣的數(shù)據(jù),可以整理成不同的形式,在下面的例子中,我們可以把GeneId作為行,樣品名稱作為列,也可以顛倒過來,以樣品名稱為行,基因編號作為列:

當(dāng)我們用R處理數(shù)據(jù)時,應(yīng)該遵循Tidy data的原則:
- 每一列:代表一個變量(vairable)
- 每一行:代表一次觀測(observation)
在我們上面的例子中,基因的ID,樣品名稱以及基因的表達(dá)量都是變量,而每一個基因在每一個樣品中的表達(dá)量可以成為一次觀測。因此,按照Tidy data的原則,應(yīng)該將上述圖表中的數(shù)據(jù)整理成如下格式:

我們在正式對生物信息學(xué)數(shù)據(jù)進(jìn)行統(tǒng)計分析之前,應(yīng)該先把我們的數(shù)據(jù)格式轉(zhuǎn)換為Tidy data格式,因為R語言中的大多數(shù)包都只支持Tidy data格式的數(shù)據(jù)。
2.使用Tidyr轉(zhuǎn)換數(shù)據(jù)格式
(1)Tidyr的安裝
在使用Tidy之前,首先要下載安裝軟件包:
1)修改下載源
依次點擊Tools--Global Options--Packages--Change,選擇一個國內(nèi)的CRAN鏡像:

2)下載安裝Tidyr
點擊Tools--Install Packages,輸入要安裝的軟件包tidyr,點擊install即可自動安裝:

或者,我們也可以使用命令行進(jìn)行軟件的安裝:
# 使用install.package()命令安裝軟件
> install.packages("tidyr")
(2) 數(shù)據(jù)的轉(zhuǎn)換-1
1)轉(zhuǎn)換策略

我們的目的是要把左邊的數(shù)據(jù)轉(zhuǎn)換成右邊的格式,要實現(xiàn)轉(zhuǎn)換結(jié)果,在Geneid一定的情況下,我們可以把每一個樣品和其對應(yīng)的基因表達(dá)量看做一個鍵-值對(key-value pair)。比如:在GeneID為gene1時,sample1對應(yīng)的表達(dá)量是3,sample2對應(yīng)的表達(dá)量是4。因此,我們在轉(zhuǎn)換數(shù)據(jù)時,只需按照上述規(guī)則,并指定要轉(zhuǎn)換的列即可。使用tidyr包中的gather函數(shù)即可實現(xiàn)轉(zhuǎn)換。
2)加載包
在使用Tidyr包之前,我們需要先加載包:
# 加載tidyr包
> library(tidyr)
3)使用gather命令將數(shù)據(jù)轉(zhuǎn)換為Tidy格式
- 1.讀取數(shù)據(jù):
> gene_exp <- read.table(file = "gene_exp.txt", sep = "\t", header = TRUE)
> gene_exp
GeneId Sample1 Sample2 Sample3
1 gene1 1 2.0 0.3
2 gene2 4 5.0 6.0
3 gene3 7 0.8 9.0
4 gene4 10 11.0 12.0
原始數(shù)據(jù)是這樣的:

- 2.格式轉(zhuǎn)換
# gather()命令轉(zhuǎn)換說明:
# gather(data=數(shù)據(jù)框名,key="key名",value="value名",要轉(zhuǎn)換的列1,列2,列3)
> gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", Sample1, Sample2, Sample3)
# 在指定要轉(zhuǎn)換的列時,也可不用列名,直接指定列的編號即可
> gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", 2:4)
# 在指定要轉(zhuǎn)換的列時,也可指定不需轉(zhuǎn)換的列,其他列參與轉(zhuǎn)換
> gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", -GeneId)
轉(zhuǎn)換后的效果:

4)使用spread()函數(shù)將Tidy格式數(shù)據(jù)還原
Tidyr中的spread()函數(shù),可以將Tidy格式的數(shù)據(jù),轉(zhuǎn)換成原來的格式:
> spread(data = gene_exp_tidy, key = "sample_name", value = "expression")
GeneId Sample1 Sample2 Sample3
1 gene1 1 2.0 0.3
2 gene2 4 5.0 6.0
3 gene3 7 0.8 9.0
4 gene4 10 11.0 12.0
(3) 數(shù)據(jù)的轉(zhuǎn)換-2
有時,在數(shù)據(jù)處理時,我們會遇到下面這種更加復(fù)雜的情況,在GeneId一定的情況下,每一樣品還對應(yīng)不同的溫度:

對這樣的數(shù)據(jù),我們應(yīng)該如何處理呢?
1)處理策略
- 1.先使用gather()函數(shù),按列進(jìn)行轉(zhuǎn)換
- 2.再使用spread()函數(shù),將Sample和溫度分開
2)數(shù)據(jù)處理
- 1.讀取數(shù)據(jù)
# 讀取數(shù)據(jù)
> gene_exp3 <- read.table(gene_exp3.txt, sep = "\t", header = TRUE)
- 2.使用gather()函數(shù)處理
> gene_exp3_tidy <- gather(gene_exp3, key, Expression, -GeneId)
gather()處理后的結(jié)果:

- 3.使用seprate()函數(shù),對key這一列進(jìn)行分割
> gene_exp3_tidy2 <- separate(gene_exp3_tidy, col = key, into = c("SampleName","Temperature"))
最終的效果如下:
