R語言入門5:數據變形-Tidyr

1.Tidy data原則

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

當我們用R處理數據時,應該遵循Tidy data的原則:

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

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

我們在正式對生物信息學數據進行統計分析之前,應該先把我們的數據格式轉換為Tidy data格式,因為R語言中的大多數包都只支持Tidy data格式的數據。

2.使用Tidyr轉換數據格式

(1)Tidyr的安裝

在使用Tidy之前,首先要下載安裝軟體包:

1)修改下載源

依次點擊Tools—Global Options—Packages—Change,選擇一個國內的CRAN鏡像

2)下載安裝Tidyr

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

或者,我們也可以使用命令行進行軟體的安裝:

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

(2) 數據的轉換-1

1)轉換策略

我們的目的是要把左邊的數據轉換成右邊的格式,要實現轉換結果,在Geneid一定的情況下,我們可以把每一個樣品和其對應的基因表達量看做一個鍵-值對(key-value pair)。比如:在GeneID為gene1時,sample1對應的表達量是3,sample2對應的表達量是4。因此,我們在轉換數據時,只需按照上述規則,並指定要轉換的列即可。使用tidyr包中的gather函數即可實現轉換。

2)載入包

在使用Tidyr包之前,我們需要先載入包:

# 載入tidyr包> library(tidyr)

3)使用gather命令將數據轉換為Tidy格式

  • 1.讀取數據:

> gene_exp <- read.table(file = "gene_exp.txt", sep = " ", header = TRUE)> gene_exp GeneId Sample1 Sample2 Sample31 gene1 1 2.0 0.32 gene2 4 5.0 6.03 gene3 7 0.8 9.04 gene4 10 11.0 12.0

原始數據是這樣的:

  • 2.格式轉換

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

轉換後的效果:

4)使用spread()函數將Tidy格式數據還原

Tidyr中的spread()函數,可以將Tidy格式的數據,轉換成原來的格式:

> spread(data = gene_exp_tidy, key = "sample_name", value = "expression") GeneId Sample1 Sample2 Sample31 gene1 1 2.0 0.32 gene2 4 5.0 6.03 gene3 7 0.8 9.04 gene4 10 11.0 12.0

(3) 數據的轉換-2

有時,在數據處理時,我們會遇到下面這種更加複雜的情況,在GeneId一定的情況下,每一樣品還對應不同的溫度:

對這樣的數據,我們應該如何處理呢?

1)處理策略

  • 1.先使用gather()函數,按列進行轉換
  • 2.再使用spread()函數,將Sample和溫度分開

2)數據處理

  • 1.讀取數據

# 讀取數據> gene_exp3 <- read.table(gene_exp3.txt, sep = " ", header = TRUE)

  • 2.使用gather()函數處理

> gene_exp3_tidy <- gather(gene_exp3, key, Expression, -GeneId)

gather()處理後的結果:

  • 3.使用seprate()函數,對key這一列進行分割

> gene_exp3_tidy2 <- separate(gene_exp3_tidy, col = key, into = c("SampleName","Temperature"))

最終的效果如下:


推薦閱讀:

TAG:生物信息學 | R編程語言 |