apply函数
刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算。
那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言本身来实现的,而向量操作是基于底层的C语言函数实现的,从性能上来看,就会有比较明显的差距了。那么如何使用C的函数来实现向量计算呢,就是要用到apply的家族函数,包括apply, sapply, tapply, mapply, lapply, rapply, vapply, eapply等。
from http://blog.fens.me/r-apply/
常用的函数为apply和sapply
- apply函数
apply(X, MARGIN, FUN, ...)
其中
- X:数组、矩阵、数据框
- MARGIN: 按行计算或按按列计算,1表示按行,2表示按列
- FUN: 自定义的调用函数
计算一个稍微复杂点的例子,按行循环,让数据框的x1列加1,并计算出x1,x2列的均值。
# 生成data.frame
# 生成data.frame
> x <- cbind(x1 = 3, x2 = c(4:1, 2:5))
> x
x1 x2
[1,] 3 4
[2,] 3 3
[3,] 3 2
[4,] 3 1
[5,] 3 2
[6,] 3 3
[7,] 3 4
[8,] 3 5
> # 自定义函数myFUN,第一个参数x为数据
> # 第二、三个参数为自定义参数,可以通过apply的'...'进行传入。
> myFUN<- function(x, c1, c2) c(sum(x[c1],1), mean(x[c2]))
> y<-apply(x,1,myFUN,c1='x1',c2=c('x1','x2'))
> y
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 4.0 4 4.0 4 4.0 4 4.0 4
[2,] 3.5 3 2.5 2 2.5 3 3.5 4
# 把数据框按行做循环,每行分别传递给myFUN函数,设置c1,c2对应myFUN的第二、三个参数
> apply(x,1,myFUN,c1='x1',c2=c('x1','x2'))#c1,c2分别为y的两行
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 4.0 4 4.0 4 4.0 4 4.0 4
[2,] 3.5 3 2.5 2 2.5 3 3.5 4
- 用apply语句对测序数据进行批量ttest或wilcox test
data<-read.table(file="genus-crc&ctrl.csv",sep = ",",header = T,stringsAsFactors = F,)
head(data)
dim(data)
rownames(data)=data[,1]#设置行名
rownames(data)=data$Genus
data_1=data[,-1]#去掉第一列
head(data_1)
pvalue=apply(data_1,1,function(x) t.test(x[1:11],x[12:21])$p.value)
##批量t检验
pvalue_wilcox=apply(data_1,1,function(x) wilcox.test(x[1:11],x[12:21],exact = F)$p.value)
##批量wilcox检验,样本量比较小的时候,相应pvalue只能通过查表近似得到,所以不能得到精确的pvalue.所以要加上【exact=F
head(pvalue)
write.table(pvalue,file = "pvalue-1.txt",sep = "\t",quote=F)
data_1$P=pvalue#在原表格中加入p值
head(data_1)
data_1$Genus=rownames(data)#将种属名称作为一列新的数据添加回去
write.table(data_1,file = "genus-crc&ctrl-c.txt",sep = "\t",row.names = F)#注意不保存row.name
网友评论