Я запускаю простой однонаправленный ANOVA для нескольких групп в рамках одного кадра данных.Извлечь значения из вложенного списка резюме (aov()) в dataframe
Dataframe доступен здесь: https://www.dropbox.com/s/6nsjk4l1pgiwal3/cut1.csv?dl=0
>download.file('https://www.dropbox.com/s/6nsjk4l1pgiwal3/cut1.csv?raw=1', destfile = "cut1.csv", method = "auto")
> data <- read.csv("cut1.csv")
> cut1 <- data %>% mutate(Plot = as.factor(Plot), Block = as.factor(Block), Cut = as.factor(Cut))
> str(cut1)
'data.frame': 160 obs. of 6 variables:
$ Plot : Factor w/ 16 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Block : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 2 2 2 2 3 3 ...
$ Treatment : Factor w/ 4 levels "AN","C","IU",..: 4 2 3 1 1 3 4 2 3 1 ...
$ Cut : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
$ Measurement: Factor w/ 10 levels "ADF","Ash","Crude_Protein",..: 5 5 5 5 5 5 5 5 5 5 ...
$ Value : num 956 965 961 963 955 ...
я использовал код из this SO question, чтобы включить функцию AOV быть применен к каждому уровню Measurement
фактора:
anova_1<- sapply(unique(as.character(cut1$Measurement)),
function(meas)aov(Value~Treatment+Block,cut1,subset=(Measurement==meas)),
simplify=FALSE,USE.NAMES=TRUE)
summary_1 <- lapply(anova_1, summary)
Я могу смотреть вручную через summary_1
но в идеале, что я хотел бы сделать, это извлечь значения p для каждого уровня фактора Measurement
в кадр данных, который я мог бы затем фильтровать, чтобы я видел только wh ich являются < 0.5. Затем я запустил TukeyHSD
.
summary_1
выглядит следующим образом (только первые 2 списков показаны):
> str(summary_1)
List of 10
$ Dry_matter :List of 1
..$ :Classes ‘anova’ and 'data.frame': 3 obs. of 5 variables:
.. ..$ Df : num [1:3] 3 3 9
.. ..$ Sum Sq : num [1:3] 359 167 612
.. ..$ Mean Sq: num [1:3] 119.8 55.5 68
.. ..$ F value: num [1:3] 1.761 0.816 NA
.. ..$ Pr(>F) : num [1:3] 0.224 0.517 NA
..- attr(*, "class")= chr [1:2] "summary.aov" "listof"
$ Crude_Protein:List of 1
..$ :Classes ‘anova’ and 'data.frame': 3 obs. of 5 variables:
.. ..$ Df : num [1:3] 3 3 9
.. ..$ Sum Sq : num [1:3] 306 721 1606
.. ..$ Mean Sq: num [1:3] 102 240 178
.. ..$ F value: num [1:3] 0.572 1.347 NA
.. ..$ Pr(>F) : num [1:3] 0.647 0.319 NA
..- attr(*, "class")= chr [1:2] "summary.aov" "listof"
я могу извлечь значение р из одного из списков в summary_1
так:
> summary_1$OAH[[1]][,5][1]
[1] 0.4734992
Однако, я не знать, как извлечь из всех вложенных списков и поместить их в фреймворк данных.
Большая обязанность за любую помощь.
также, вы пробовали 'unsplit' или' data.table :: rbindlist'? – C8H10N4O2
@caffeine У меня никогда не было проблемы с использованием набора данных Dropbox ранее здесь –
@ C8H10N4O2 с использованием rbindlist дает мне следующую ошибку: «Ошибка в FUN (X [[i]], ...): Недопустимый столбец: он имеет Габаритные размеры. Невозможно отформатировать его. Если это результат data.table (table()), вместо этого используйте as.data.table (таблица()). –