美文网首页
使用apply函数批量处理数据

使用apply函数批量处理数据

作者: ReneeeeKKKK | 来源:发表于2021-01-02 21:48 被阅读0次

    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函数批量处理数据

          本文链接:https://www.haomeiwen.com/subject/ywhyoktx.html