美文网首页
【R】批量完成Oneway ANOVA,并以Mean±SD格式(

【R】批量完成Oneway ANOVA,并以Mean±SD格式(

作者: Cdudu | 来源:发表于2020-05-14 21:18 被阅读0次

    批量完成Oneway ANOVA之前其实就写过,但是老的代码对刚入门R语言的人可能还是不太友好,因此又修改了一版。这一版的代码可以说即使不懂R语言也一样可以使用,当然前提是你的电脑里安装了R。

    注意事项

    1. 本代码适用于OneWay ANOVA统计方法,别的统计方法需要改代码
    2. 由于在样本量较少的情况下,OneWay ANOVA对正态性和方差齐性都不是特别敏感,因此这个代码中没有做这两步检验
    3. 本代码事后检验方法用的是LSD,如果需要使用其他事后检验方法,需要修改代码

    数据准备

    1. 将数据按下表的形式整理好,表格中要包含测定指标分组信息,并且以列的形式存放
    2. 所有测定指标要放在一起
    group BW SGR CAT SOD
    1 4 1.2 21 2.2
    1 5 1.4 22 2.3
    1 6 1.5 23 2.5
    2 14 2.2 33 3.5
    2 15 2.4 34 3.6
    2 16 2.5 35 3.7
    3 24 3.2 43 4.4
    3 25 3.4 33 4.6
    3 26 3.5 45 4.8

    R代码

    #############################################
    ##
    ## 批量求均值和SD
    ##
    ##-----------------------------------------
    ## Author : Cdudu
    ## Data   : 2020 5/14
    ############################################
    
    #清空目前环境中的变量
    rm(list = ls()) 
    
    #加载所需要的包
    #LSD.test函数来自agricolae包
    library(readxl)
    library(agricolae)
    
    #读入数据
    dat<-read_excel('sample.xlsx')
    
    #将分组转化为因子型
    dat$Group<-as.factor(dat$Group)
    summary(dat)
    
    #输入处理组数量
    groupNumber<-5
      
    #创建新表用于存放Mean,SD和P值
    dat2<-data.frame(t1=as.character(1:(groupNumber+1))) 
    
    #输入dat中应变量(待检验指标)的起始列数
    Star<-3
    
    #输入dat中应变量(待检验指标)的终止列数
    Over<-18
    
    #Mean,SD&P值计算
    for ( i in c(Star:Over)){                       
      means<-tapply(dat[[i]],dat$Group,mean)
      means<-sprintf('%.4f',round(means,4))  #小数点位数,注意'%.4f'和round()中的数字都要做对应修改
      SD<-tapply(dat[[i]],dat$Group,sd)
      SD<-sprintf('%.4f',round(SD,4))       #小数点位数,注意'%.4f'和round()中的数字都要做对应修改
      M.aov<-aov(dat[[i]]~Group,data=dat) 
      aov.sum<-summary(M.aov)
      pvalue<-aov.sum[[1]]$`Pr(>F)`[1]
      if(pvalue>0.05){
        a<-paste(means,'±',SD)
        a[(groupNumber+1)]<-'NS'      
      }           
      else if(pvalue>0.01){
        out <- LSD.test(M.aov, "Group", p.adj="none")
        marker<-out$groups
        row_name <- row.names(marker)
        newmarker <- data.frame(row_name,marker$groups)
        newmarker <- newmarker[order(newmarker$row_name),]
        pmarker<-newmarker$marker.groups
        a<-paste(means,'±',SD,pmarker)
        a[(groupNumber+1)]<-'*'
      }
      else {
        out <- LSD.test(M.aov, "Group", p.adj="none")
        marker<-out$groups
        row_name <- row.names(marker)
        newmarker <- data.frame(row_name,marker$groups)
        newmarker <- newmarker[order(newmarker$row_name),]
        pmarker<-newmarker$marker.groups
        a<-paste(means,'±',SD,pmarker)
        a[(groupNumber+1)]<-'**'
      }
      dat2[i-2]<-a
      names(dat2)[i-2]<-names(dat[i])
    }
    
    #行列转置
    dat3<-t(dat2)  
    
    #导出表格
    write.csv(dat3,'Mean&SD.csv')
    
    

    以上就是全部代码,实际操作中只需要三步操作
    1.将下面代码中的文件名换成你自己的

    dat<-read_excel('sample.xlsx')
    

    2.在下面代码中输入处理组数量,比如本例中是3组,就输入3

    groupNumber<-5
    
    1. 在下面代码中输入测定指标开始和结束的列数,比如本例中测定指标放在第2-5列,那么Star就输入2,Over输入5
    #输入dat中应变量(待检验指标)的起始列数
    Star<-3
    
    #输入dat中应变量(待检验指标)的终止列数
    Over<-18
    

    剩下的代码就不用管啦

    EXCEL输出结果

    如果是将dat3输出到EXCEL,那么表格如下

    NULL V1 V2 V3 V4
    BW 3±0.2a 4±0.3b 5±0.4c *
    SGR 3±0.2 3±0.2 3±0.2 NS
    CAT 3±0.2a 3±0.2b 3±0.2c **
    SOD 3±0.2 3±0.2 3±0.2 NS

    V1;V2;V3即是3个试验组,V4是p值展示,里面的数值是我瞎编的。

    • NS:p>0.05
    • *: 0.05>p>0.01
    • **: p<0.01

    当然也可以将dat2输出到EXCEL,那么表格如下

    NULL BW SGR CAT SOD
    V1 3±0.2 3±0.2a 3±0.2a 3±0.2
    V2 3±0.2 3±0.2b 3±0.2b 3±0.2
    V3 3±0.2 3±0.2c 3±0.2c 3±0.2
    V4 NS * ** NS

    批量将标记字母设为上标

    需要注意到的是,R导出到EXCEL的结果中虽然带了表示各组显著性差异的标记字母,但是这些字母的格式并没有被设定为上标。
    因此需要在WORD中完成格式的设定,同样一个个修改太麻烦,推荐一个批量修改的方法,具体步骤如下

    1. 将EXCEL中的数据拷贝到WOED中
    2. 点击替换,在查找内容中输入[a-z],并勾选使用通配符


      一定要勾选使用通配符
    3. 点击替换为,然后点格式


      一定要先点替换为,再点格式
    4. 选择格式-字体-上标-确认
    5. 全部替换

    以上

    相关文章

      网友评论

          本文标题:【R】批量完成Oneway ANOVA,并以Mean±SD格式(

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