相比于网页工具,使用编程语言处理科研数据的一大优势,在于高度的定制化,以及批量处理数据的快捷性和高效性
对于批量处理数据的方法,之前使用for循环和apply语句进行处理过,但是不够系统,学习果子生信课程后有一个清晰的认识,写下来,一是可以调用方便,二是自己写过之后,才能算是完全掌握。当然一切以解决问题为主,不陷于技术深究。
之前使用apply家族函数,只用过apply,也就是对数据框的处理。学习了果子课程后,发现lapply函数和do.call函数连用,真是神器。
一个简单的目录
批量处理——for循环批量计算组间差异
数据准备
rm(list = ls())
library(survminer)
data("myeloma")
head(myeloma)[1:3,1:11]
colnames(myeloma)
data = myeloma
还是使用R再带数据集
构建函数
先要了解lapply函数的使用方法
lapply(X, FUN, ...)这是其特点,前面是操作的内容,后面是操作使用的函数,函数使用后,返回列表,也就是list。所以要使用lapply函数,先要有操作函数,这个函数可以是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)
}
测试函数
> my.kruskal("CCND1")
gene p.value
1 CCND1 2.888423e-30
lapply函数批量操作
lapplylist <- lapply(colnames(data)[6:11], my.kruskal)
结果是这个样子
使用do.call转换
前面得到的是列表,不便于后续的操作,要通过do.call 进行转换
kruskal_data <- do.call(rbind, lapplylist)
结果就返回数据框,便于后续操作
整合成一步
# 整合成一个步骤
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)
}))
根据p值进行筛选
kruskal_data_p <- kruskal_data %>%
filter( `p.value` < 0.01 ) %>%
arrange(desc(p.value))
整个操作的代码
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)
}
### 测试函数功能
my.kruskal("CCND1")
# 第2步lapply批量作用于函数,返回list
lapplylist <- lapply(colnames(data)[6:11], my.kruskal)
# 第3步do.call 转换list
kruskal_data <- do.call(rbind, lapplylist)
# 整合成一个步骤
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))
后记:有相关的统计量,进行筛选后,最好能够根据筛选结果画图,后续就使用批量的方法进行画图