tidyverse:每个因子水平的方差分析
我想对因子的每个水平进行方差分析。我可以用tidyverse:每个因子水平的方差分析,r,dplyr,purrr,anova,R,Dplyr,Purrr,Anova,我想对因子的每个水平进行方差分析。我可以用dplyr::do来实现这一点,但也希望用purr来实现这一点。请给我任何提示 library(tidyverse) df1 <- mtcars df1$cyl <- factor(df1$cyl) df1$gear <- factor(df1$gear) fm1 <- df1 %>% dplyr::group_by(gear) %>% dplyr::do(m1 = summary(aov(mpg ~
dplyr::do
来实现这一点,但也希望用purr
来实现这一点。请给我任何提示
library(tidyverse)
df1 <- mtcars
df1$cyl <- factor(df1$cyl)
df1$gear <- factor(df1$gear)
fm1 <-
df1 %>%
dplyr::group_by(gear) %>%
dplyr::do(m1 = summary(aov(mpg ~ cyl, data = .)))
fm1$m1
> fm1$m1
[[1]]
Df Sum Sq Mean Sq F value Pr(>F)
cyl 2 69.03 34.52 4.596 0.033 *
Residuals 12 90.11 7.51
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
[[2]]
Df Sum Sq Mean Sq F value Pr(>F)
cyl 1 137.3 137.3 8.123 0.0172 *
Residuals 10 169.0 16.9
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
[[3]]
Df Sum Sq Mean Sq F value Pr(>F)
cyl 2 167.4 83.68 16.74 0.0564 .
Residuals 2 10.0 5.00
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
fm2 <-
df1 %>%
dplyr::group_by(gear) %>%
tidyr::nest() %>%
dplyr::mutate(m2 = purrr::map(.x = data, .f = ~ summary(aov(mpg ~ cyl, data = .)))) %>%
tidyr::unnest()
库(tidyverse)
df1(F)
气缸2 69.03 34.52 4.596 0.033*
残差12 90.11 7.51
---
签名。代码:0'***'0.001'***'0.01'*'0.05'.'0.1''1
[[2]]
Df和Sq平均Sq F值Pr(>F)
气缸1 137.3 137.3 8.123 0.0172*
残差10169.016.9
---
签名。代码:0'***'0.001'***'0.01'*'0.05'.'0.1''1
[[3]]
Df和Sq平均Sq F值Pr(>F)
气缸2 167.4 83.68 16.74 0.0564。
残差2 10.0 5.00
---
签名。代码:0'***'0.001'***'0.01'*'0.05'.'0.1''1
fm2%
dplyr::分组依据(档位)%>%
tidyr::nest()%>%
dplyr::mutate(m2=purrr::map(.x=data,.f=~summary(aov(mpg~cyl,data=))))%>%
tidyr::unnest()
您可以使用嵌套的数据框,然后将所有摘要保存在新的列表列中:
库(tidyverse)
df1%
tidyr::nest()%>%
dplyr::mutate(.data=。,
aov_结果=数据%>%purrr::map(.x=,.f=~summary(aov(mpg~cyl,数据=))
df_aov$aov_结果[[1]]
#>Df和Sq平均Sq F值Pr(>F)
#>气缸1 137.3 137.3 8.123 0.0172*
#>残差10169.016.9
#> ---
#>签名。代码:0'***'0.001'***'0.01'*'0.05'.'0.1''1
由(v0.2.1)创建于2018-10-02如果删除最后的
unnest()
步骤,您是否拥有所需内容?然后fm2$m2
将匹配fm1$m1
。感谢@aosmith提供有用的评论。如果您能指导如何为这些组件自动命名,我们将不胜感激。有一种简单的方法可以做到这一点,它不需要使用标准的split-apply技术拉入整个tidyverse:fm2=lappy(split(df1,df1$gear),function(d){summary(aov(mpg~cyl,data=d)))
。您可以在mutate()中设置名称。像m2=purrr::map(.x=data,.f=~summary(aov(mpg~cyl,data=))%%>%setNames(gear)
如果你想给出“你的问题没有一个直接的答案”,你最好给出一个基本的R解决方案,它很简单:fm2=lappy(split(mtcars,mtcars$gear),函数(d){summary(aov(mpg~cyl,data=d))}
我修改了我的答案。