使用apply函数批量处理数据

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

  1. 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
  1. 用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

你可能感兴趣的:(使用apply函数批量处理数据)