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))}
我修改了我的答案。