批量处理——apply批量计算组间差异

Rstudio

相比于网页工具,使用编程语言处理科研数据的一大优势,在于高度的定制化,以及批量处理数据的快捷性和高效性

对于批量处理数据的方法,之前使用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)

结果是这个样子

lapply操作后的结果

使用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))

后记:有相关的统计量,进行筛选后,最好能够根据筛选结果画图,后续就使用批量的方法进行画图

你可能感兴趣的:(批量处理——apply批量计算组间差异)