首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rbind()只迭代最后3个anova结果吗?

rbind()只迭代最后3个anova结果吗?
EN

Stack Overflow用户
提问于 2017-10-20 16:27:12
回答 1查看 277关注 0票数 0

我编写了一个循环,在其中迭代给定.csv的列,并运行anova和posthoc测试。然后将每个结果组合到一个数据框架中,并将其导出到一个.csv文件中。但是,我无法获得rbind()来构建我的data.frame。在这方面有什么帮助吗?下面是脚本:

代码语言:javascript
复制
setwd("~/School/Lab/mice/sugar_study_2015/MG-RAST and Metagenassist/Trimmed/R. CSV")
#Save your Datasheet into variable X
x <- read.csv("T0_B_Class_Anova.csv")

x = x[1:9,]
x[is.na(x)] <- 0

DF.Anova <- data.frame()
DF.Tukey <- data.frame()

#Counts through the columns
for(i in 2:(ncol(x)-1)){
  columns <- names(x[i])
 
##Runs an ANOVA - 'Group' being a grouping factor
  anovaresult <- anova(aov(x[,i]~Group,data=x))
  
  DF.Anova <- rbind(DF.Anova, anovaresult)
 
  ##fix anova into data frame
  Famall = colnames(x)
  Famall = as.data.frame(Famall)
  Famall = Famall[2:83,]
  Famall = as.data.frame(Famall)
  DFanovanames = rep(Famall, each = 2)
  DFanovanames = as.data.frame(DFanovanames)
  #install.packages("tidyr")
  library(tidyr)
  anovanames = data.frame(Names=unlist(DFanovanames, use.names = FALSE))
  o.anovanames = dplyr::arrange(anovanames, Names)
###dont forget to change this**************************
  finalanova_BFT0 = cbind(rn = rownames(DF.Anova), DF.Anova, o.anovanames)
 
##Runs Tukeys Post-hoc test on Anova
  posthocresult <- TukeyHSD(aov(x[,i]~Group,data=x))
 
  DF.Tukey <- rbind(DF.Tukey, posthocresult$Group)
 
  ##fix tukey into data frame
  Famname = colnames(x)
  Famname = as.data.frame(Famname)
  Famname = Famname[2:83,]
  Famname = as.data.frame(Famname)
  DFposthocnames = rep(Famname, each = 3)
  DFposthocnames = data.frame(DFposthocnames)
  #install.packages("tidyr")
  library(tidyr)
  library(dplyr)
  posthocnames = data.frame(Names=unlist(DFposthocnames, use.names = FALSE))
  o.posthocnames = dplyr::arrange(posthocnames, Names)
###dont forget to change this****************************
  finalposthoc_BFT0 = cbind(rn = rownames(DF.Tukey), DF.Tukey, o.posthocnames)
                           
##Prints posthoc results into txt file
  print(columns)
  print(anovaresult)
  print(posthocresult)
}
 
write.csv(finalanova_BFT0, file="testfinalanova_BCT0")
write.csv(finalposthoc_BFT0, file="finalposthoc_BCT0")

您可以找到示例.csv 这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-20 17:02:48

假设您想要的输出是两个不同测试的摘要结果的2个dataframes。您可以通过使用来自map包的purrr函数和来自broom包的tidy函数来实现这一点。我保存了你发布的csv,并将其保存为anova-question-data.csv。如果要使用setwd,我建议您验证数据读取是否正确。下面是我用来获取这两个数据帧的代码:

代码语言:javascript
复制
# read in the data
df <- read_csv(file = "anova-question-data.csv")

# create a list to loop over in the `map` call. 
loop_list <- colnames(df[,-1])

# create a list of data frames using the `tidy` function from `broom`
anova_list <- map(loop_list, function(x){
  anova_results <- anova(aov(df[[x]]~df[["Group"]]))

  # this tidies the results from the anova test and add a new 
  # column with the column name being tested. 
  # if bacteria is not your desired name, feel free to change it as 
  # it will not affect any of the rest of the code
  output <- broom::tidy(anova_results) %>%
    mutate(bacteria = x)
})

# use `do.call` to bind the dataframes in anova_list together
anova_df <- anova_list %>%
  do.call(rbind, .)

# repeat the exact same process only changing `anova` with `TukeyHSD`
posthoc_list <- map(loop_list, function(x){
  posthoc_results <- TukeyHSD(aov(df[[x]]~df[["Group"]]))

  output <- broom::tidy(posthoc_results) %>%
    mutate(bacteria = x)
 })

posthoc_df <- posthoc_list %>%
  do.call(rbind, .)

这给出了以下两个输出(我只打算打印前5行):

代码语言:javascript
复制
> head(anova_df, 5)
         term    df        sumsq       meansq  statistic   p.value            bacteria
 1 df[["Group"]]  2 1.265562e-07 6.327809e-08 0.02650174 0.9739597       Acidobacteria
 2     Residuals  6 1.432617e-05 2.387695e-06         NA        NA       Acidobacteria
 3 df[["Group"]]  2 9.332880e-02 4.666440e-02 0.84001916 0.4768300      Actinobacteria
 4     Residuals  6 3.333096e-01 5.555159e-02         NA        NA      Actinobacteria
 5 df[["Group"]]  2 9.114521e-04 4.557261e-04 1.08994816 0.3946484 Alphaproteobacteria


> head(posthoc_df, 5)
           term comparison      estimate     conf.low   conf.high adj.p.value       bacteria
1 df[["Group"]]      HF-CO  2.234233e-04 -0.003647709 0.004094556   0.9829095  Acidobacteria
2 df[["Group"]]     HFS-CO -4.903533e-05 -0.003920168 0.003822097   0.9991677  Acidobacteria
3 df[["Group"]]     HFS-HF -2.724587e-04 -0.004143591 0.003598674   0.9747264  Acidobacteria
4 df[["Group"]]      HF-CO  2.345822e-01 -0.355886402 0.825050849   0.4856694 Actinobacteria
5 df[["Group"]]     HFS-CO  1.907267e-01 -0.399741917 0.781195333   0.6084817 Actinobacteria
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46853397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档