我們已經使用Tidyr將數據進行了變形,使其符合Tidy data的原則。而在對數據進行正式的統計分析之前,通常還需要進行一些必要的數據處理,如:
- 改變結構:排序,修改列名
- 按行操作:過濾,選取,抽樣
- 按列操作:篩選特定列
- 統計、分組統計:最大值,最小值等
要完成以上這些分析,我們可以使用R中非常強大的一個包dplyr,通過幾個簡單的命令,即可完成我們想要的分析。
1.dplyr包的安裝和加載
# 安裝dplyr包
>install.packages("dplyr")
# 加載dplyr包
>library(dplyr)
2.使用dplyr進行數據管理
(1)排序:arrange
在使用tidyr對數據進行處理后,如下:

image
在上面的圖表中,是以SampleName進行排序的,我們可以以GeneId進行排序:
# arrange(數據框名,要排序的列名)
gene_exp_GeneId <- arrange(gene_exp_tidy, GeneId)
按GeneId排序后的效果如下:

image
如果我們想要在GeneId排序的基礎上,再以Expression排序:
gene_exp_GeneId_Exp <- arrange(gene_exp_tidy, GeneId, Expression)

image
默認條件下,是以升序排列的,如果我們想要以降序排列,只需在需要降序排列的列名前添加desc即可:
# 降序排列
gene_exp_GeneId_descExp <- arrange(gene_exp_tidy, GeneId, desc(Expression))

image
(2)按行(觀測)篩選:filter
篩選出表達量大于1的觀測:
# filter(數據框名,篩選條件)
filter(gene_exp_tidy, Expression > 1)

image
篩選出表達量大于1,并且基因名為gene1的觀測:
filter(gene_exp_tidy, Expression > 1, GeneId == "gene1")

image
(3)按列篩選:select
select函數用于選擇需要展示的列:
# 只展示SampleName和Expression列
select(gene_exp_tidy, SampleName, Expression)

image
使用select函數,我們還可以進行模糊的篩選:
# 篩選所有列名中包含"me"的列
select(gene_exp_tidy, contains("me"))

image
# 展示所有列名中,以G開始的列
select(gene_exp_tidy, starts_with("G"))

image
(4)管道操作符:%>%
我們對數據的篩選和排序操作,可以使用管道符連接起來,一步即可完成:
# 先篩選出表達量大于1的觀測,再按GeneId升序排列,同時按Expression降序排列
filter(gene_exp_tidy, Expression >1) %>% arrange(GeneId, desc(Expression))
# 說明:使用管道符連接時,第一個操作的輸出結果會成為第二個操作的輸入,因此在arrange中不再需要指定數據框的名稱

image
(5)去除重復:distinct
使用distinct函數,我們可以去除數據框中有重復的行:
# 去除GeneId中有重復的行
distinct(gene_exp_tidy, GeneId)

image
(6)添加新變量:mutate
mutate函數用于根據已有的變量,產生一個新的變量:
# 產生一個表達量是現有表達量10倍的變量
mutate(gene_exp_tidy, "10Exp" = Expression * 10)

image
# 得到表達量變?yōu)?0倍的變量后,去除原來的Express列
mutate(gene_exp_tidy, "10Exp" = Expression * 10) %>%
select(-Expression)

image
# 在每一個GeneId前面,添加Os字符,用于說明是水稻的基因,并去除原來的GeneId列
# paste函數用來連接字符
mutate(gene_exp_tidy, Gene_ID = paste("Os", GeneId, sep = "_" ) ) %>%
select(Gene_ID, SampleName, Expression)

image
(7)分組統計:group_by %>% summarise
使用summarise函數,可以對數據進行簡單的統計:
# 計算Expressin的平均值
summarise(gene_exp_tidy, avg = mean(Expression))

image
先對數據進行分組,再進行統計:
# 先以GeneId進行分組,再計算平均值
gene_exp_tidy %>%
group_by(GeneId)%>%
summarise(avg = mean(Expression))

image
# 計算每個基因在三個樣品中表達量的標準差sd
gene_exp_tidy %>%
group_by(GeneId)%>%
summarise(sd = sd(Expression))

image