R語言入門5:數(shù)據(jù)變形-Tidyr

1.Tidy data原則

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

image

當(dāng)我們用R處理數(shù)據(jù)時,應(yīng)該遵循Tidy data的原則:

  • 每一列:代表一個變量(vairable)
  • 每一行:代表一次觀測(observation)

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

image

我們在正式對生物信息學(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鏡像

image

2)下載安裝Tidyr

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

image

或者,我們也可以使用命令行進(jìn)行軟件的安裝:

# 使用install.package()命令安裝軟件
> install.packages("tidyr")

(2) 數(shù)據(jù)的轉(zhuǎn)換-1

1)轉(zhuǎn)換策略

image

我們的目的是要把左邊的數(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ù)是這樣的:

image
  • 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)換后的效果:


image

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)不同的溫度:

image

對這樣的數(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é)果:

image
  • 3.使用seprate()函數(shù),對key這一列進(jìn)行分割
> gene_exp3_tidy2 <- separate(gene_exp3_tidy, col = key, into = c("SampleName","Temperature"))

最終的效果如下:

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容