将摘要(aov()) 的嵌套列表中的值提取到数据框中

Ror*_*haw 2 r list nested-lists anova sapply

我正在单个数据框中跨多个组运行简单的单向方差分析。

\n\n

此处提供数据框:https ://www.dropbox.com/s/6nsjk4l1pgiwal3/cut1.csv?dl=0

\n\n
>download.file(\'https://www.dropbox.com/s/6nsjk4l1pgiwal3/cut1.csv?raw=1\', destfile = "cut1.csv", method = "auto")\n\n> data <- read.csv("cut1.csv")\n> cut1 <- data %>% mutate(Plot = as.factor(Plot), Block = as.factor(Block), Cut = as.factor(Cut)) \n\n> str(cut1)\n\'data.frame\':   160 obs. of  6 variables:\n $ Plot       : Factor w/ 16 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...\n $ Block      : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 2 2 2 2 3 3 ...\n $ Treatment  : Factor w/ 4 levels "AN","C","IU",..: 4 2 3 1 1 3 4 2 3 1 ...\n $ Cut        : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...\n $ Measurement: Factor w/ 10 levels "ADF","Ash","Crude_Protein",..: 5 5 5 5 5 5 5 5 5 5 ...\n $ Value      : num  956 965 961 963 955 ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

我使用了这个SO问题中的一些代码来使aov函数能够应用于每个级别的Measurement因素:

\n\n
anova_1<- sapply(unique(as.character(cut1$Measurement)),\n                 function(meas)aov(Value~Treatment+Block,cut1,subset=(Measurement==meas)),\n                 simplify=FALSE,USE.NAMES=TRUE)\nsummary_1 <- lapply(anova_1, summary)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以手动查看,summary_1但理想情况下我想做的是将因子每个级别的 p 值提取Measurement到数据框中,然后我可以对其进行过滤,以便只看到哪些 <0.5。然后我会TukeyHSD在这些上运行。

\n\n

summary_1看起来像这样(仅显示前 2 个列表):

\n\n
> str(summary_1)\nList of 10\n $ Dry_matter   :List of 1\n  ..$ :Classes \xe2\x80\x98anova\xe2\x80\x99 and \'data.frame\':    3 obs. of  5 variables:\n  .. ..$ Df     : num [1:3] 3 3 9\n  .. ..$ Sum Sq : num [1:3] 359 167 612\n  .. ..$ Mean Sq: num [1:3] 119.8 55.5 68\n  .. ..$ F value: num [1:3] 1.761 0.816 NA\n  .. ..$ Pr(>F) : num [1:3] 0.224 0.517 NA\n  ..- attr(*, "class")= chr [1:2] "summary.aov" "listof"\n $ Crude_Protein:List of 1\n  ..$ :Classes \xe2\x80\x98anova\xe2\x80\x99 and \'data.frame\':    3 obs. of  5 variables:\n  .. ..$ Df     : num [1:3] 3 3 9\n  .. ..$ Sum Sq : num [1:3] 306 721 1606\n  .. ..$ Mean Sq: num [1:3] 102 240 178\n  .. ..$ F value: num [1:3] 0.572 1.347 NA\n  .. ..$ Pr(>F) : num [1:3] 0.647 0.319 NA\n  ..- attr(*, "class")= chr [1:2] "summary.aov" "listof"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以从列表之一中提取 p 值,summary_1如下所示:

\n\n
> summary_1$OAH[[1]][,5][1]\n[1] 0.4734992\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,我不知道如何从所有嵌套列表中提取并放入数据框中。

\n\n

非常感谢任何帮助。

\n

mto*_*oto 5

您可以将该包与apply bybroom结合使用,并将输出以整洁的格式分配给 a 。dplyrAnovaMeasurementdata.frame

library(broom)
library(dplyr)

summaries <- cut1 %>% group_by(Measurement) %>% 
        do(tidy(aov(Value ~ Treatment + Block, data = .)))

head(summaries)
#  Measurement      term    df      sumsq    meansq statistic    p.value
#       (fctr)     (chr) (dbl)      (dbl)     (dbl)     (dbl)      (dbl)
#1         ADF Treatment     3  41.416875 13.805625  3.097871 0.07138437
#2         ADF     Block     1   8.001125  8.001125  1.795388 0.20729351
#3         ADF Residuals    11  49.021375  4.456489        NA         NA
#4         Ash Treatment     3  38.511875 12.837292  1.051787 0.40840601
#5         Ash     Block     1  34.980125 34.980125  2.865998 0.11856463
#6         Ash Residuals    11 134.257375 12.205216        NA         NA
Run Code Online (Sandbox Code Playgroud)