dplyr 中 summarise() 函数的替代方法

1 r dplyr tidyverse

food_consumption %>% 
   group_by(food_category) %>% 
   summarise(mod= lm(co2_emmission ~ consumption))
Run Code Online (Sandbox Code Playgroud)

运行此代码后,我收到以下错误

错误:列的mod长度必须为 1(汇总值),而不是 12

我怎样才能做到正确,并获得每个类别的回归结果?

akr*_*run 5

我们可以将lm模型的输出包装在 a 中,list因为它有很多组件,并且summarise希望为每组返回长度为 1

library(dplyr)
food_consumption %>% 
     group_by(food_category) %>%
     summarise(mod= list(lm(co2_emmission ~ consumption)))
Run Code Online (Sandbox Code Playgroud)

在 的devel版本中dplyr,可以使用condense,它会自动返回一个list

food_consumption %>% 
     group_by(food_category) %>%
     condense(mod= lm(co2_emmission ~ consumption))
Run Code Online (Sandbox Code Playgroud)

使用可重现的示例

mtcars %>% 
     group_by(cyl) %>%
     summarise(mod = list(lm(mpg ~ gear)))
# A tibble: 3 x 2
#    cyl mod   
#  <dbl> <list>
#1     4 <lm>  
#2     6 <lm>  
#3     8 <lm>  
Run Code Online (Sandbox Code Playgroud)

或与 condense

mtcars %>% 
   group_by(cyl) %>%
   condense(mod = lm(mpg ~ gear))
# A tibble: 3 x 2
# Rowwise:  cyl
#    cyl mod   
#  <dbl> <list>
#1     4 <lm>  
#2     6 <lm>  
#3     8 <lm>  
Run Code Online (Sandbox Code Playgroud)

为了得到系数

mtcars %>% 
   group_by(cyl) %>%
    condense(mod = lm(mpg ~ gear), Coef = coef(mod))
# A tibble: 3 x 3
# Rowwise:  cyl
#    cyl mod    Coef     
#  <dbl> <list> <list>   
#1     4 <lm>   <dbl [2]>
#2     6 <lm>   <dbl [2]>
#3     8 <lm>   <dbl [2]>
Run Code Online (Sandbox Code Playgroud)

mutatemap

mtcars %>% 
    group_by(cyl) %>%
    summarise(mod = list(lm(mpg ~ gear))) %>% 
    mutate(Coef = map(mod, coef))
# A tibble: 3 x 3
#    cyl mod    Coef     
#  <dbl> <list> <list>   
#1     4 <lm>   <dbl [2]>
#2     6 <lm>   <dbl [2]>
#3     8 <lm>   <dbl [2]>
Run Code Online (Sandbox Code Playgroud)

或者另一种选择是nest然后maplist

library(purrr)
mtcars %>% 
    group_by(cyl) %>% 
    nest %>% 
    transmute(mod = map(data, ~ lm(mpg ~ gear, data = .x)))
# A tibble: 3 x 2
# Groups:   cyl [3]
#    cyl mod   
#  <dbl> <list>
#1     6 <lm>  
#2     4 <lm>  
#3     8 <lm>  
Run Code Online (Sandbox Code Playgroud)