
相比于網(wǎng)頁工具,使用編程語言處理科研數(shù)據(jù)的一大優(yōu)勢,在于高度的定制化,以及批量處理數(shù)據(jù)的快捷性和高效性
對于批量處理數(shù)據(jù)的方法,之前使用for循環(huán)和apply語句進(jìn)行處理過,但是不夠系統(tǒng),學(xué)習(xí)果子生信課程后有一個(gè)清晰的認(rèn)識,寫下來,一是可以調(diào)用方便,二是自己寫過之后,才能算是完全掌握。當(dāng)然一切以解決問題為主,不陷于技術(shù)深究。
之前使用apply家族函數(shù),只用過apply,也就是對數(shù)據(jù)框的處理。學(xué)習(xí)了果子課程后,發(fā)現(xiàn)lapply函數(shù)和do.call函數(shù)連用,真是神器。
一個(gè)簡單的目錄
批量處理——for循環(huán)批量計(jì)算組間差異
數(shù)據(jù)準(zhǔn)備
rm(list = ls())
library(survminer)
data("myeloma")
head(myeloma)[1:3,1:11]
colnames(myeloma)
data = myeloma
還是使用R再帶數(shù)據(jù)集
構(gòu)建函數(shù)
先要了解lapply函數(shù)的使用方法
lapply(X, FUN, ...)這是其特點(diǎn),前面是操作的內(nèi)容,后面是操作使用的函數(shù),函數(shù)使用后,返回列表,也就是list。所以要使用lapply函數(shù),先要有操作函數(shù),這個(gè)函數(shù)可以是R自帶,也可以是自己寫的
# 第1,寫出單次處理的function
my.kruskal= function(x){
dd <- kruskal.test(data[,x] ~ molecular_group, data = data)
data.frame(gene=x,p.value=dd$p.value)
}
測試函數(shù)
> my.kruskal("CCND1")
gene p.value
1 CCND1 2.888423e-30
lapply函數(shù)批量操作
lapplylist <- lapply(colnames(data)[6:11], my.kruskal)
結(jié)果是這個(gè)樣子

使用do.call轉(zhuǎn)換
前面得到的是列表,不便于后續(xù)的操作,要通過do.call 進(jìn)行轉(zhuǎn)換
kruskal_data <- do.call(rbind, lapplylist)
結(jié)果就返回?cái)?shù)據(jù)框,便于后續(xù)操作

整合成一步
# 整合成一個(gè)步驟
kruskal_data <- do.call(rbind, lapply(colnames(data)[6:11], function(x){
dd <- kruskal.test(data[,x] ~ molecular_group, data = data)
data.frame(gene=x,p.value=dd$p.value)
}))
根據(jù)p值進(jìn)行篩選
kruskal_data_p <- kruskal_data %>%
filter( `p.value` < 0.01 ) %>%
arrange(desc(p.value))
整個(gè)操作的代碼
rm(list = ls())
library(survminer)
data("myeloma")
head(myeloma)[1:3,1:11]
colnames(myeloma)
data = myeloma
table(data$molecular_group)
# 第1,寫出單次處理的function
my.kruskal= function(x){
dd <- kruskal.test(data[,x] ~ molecular_group, data = data)
data.frame(gene=x,p.value=dd$p.value)
}
### 測試函數(shù)功能
my.kruskal("CCND1")
# 第2步lapply批量作用于函數(shù),返回list
lapplylist <- lapply(colnames(data)[6:11], my.kruskal)
# 第3步do.call 轉(zhuǎn)換list
kruskal_data <- do.call(rbind, lapplylist)
# 整合成一個(gè)步驟
kruskal_data <- do.call(rbind, lapply(colnames(data)[6:11], function(x){
dd <- kruskal.test(data[,x] ~ molecular_group, data = data)
data.frame(gene=x,p.value=dd$p.value)
}))
kruskal_data_p <- kruskal_data %>%
filter( `p.value` < 0.01 ) %>%
arrange(desc(p.value))
后記:有相關(guān)的統(tǒng)計(jì)量,進(jìn)行篩選后,最好能夠根據(jù)篩選結(jié)果畫圖,后續(xù)就使用批量的方法進(jìn)行畫圖