Add dynamic value to row by group

Viewed 52

I'd like to add a row for each group, where the entry for a particular column is the mean of the values of that column for that group. It's easy to add a constant value

library(dplyr)
mtcars %>% group_by(cyl) %>% group_modify(~add_row(.x, .before=0, carb=2))
# A tibble: 35 x 11
# Groups:   cyl [3]
     cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1     4  NA    NA      NA NA    NA     NA      NA    NA    NA     2
 2     4  22.8 108      93  3.85  2.32  18.6     1     1     4     1
 3     4  24.4 147.     62  3.69  3.19  20       1     0     4     2
 4     4  22.8 141.     95  3.92  3.15  22.9     1     0     4     2

But when I try to dynamically add e.g. the mean of all carbs for that group, it doesn't recognise carb as a column:

mtcars %>% group_by(cyl) %>% group_modify(~add_row(.x, .before=0, carb=mean(carb)))

Error in mean(carb) : object 'carb' not found

1 Answers

Alternatively:

library(tidyverse)

mtcars %>% 
  group_by(cyl) %>% 
  summarise(carb = mean(carb)) %>% 
  bind_rows(mtcars) %>% 
  arrange(cyl)

#> # A tibble: 35 x 11
#>      cyl  carb   mpg  disp    hp  drat    wt  qsec    vs    am  gear
#>  * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1     4  1.55  NA    NA      NA NA    NA     NA      NA    NA    NA
#>  2     4  1     22.8 108      93  3.85  2.32  18.6     1     1     4
#>  3     4  2     24.4 147.     62  3.69  3.19  20       1     0     4
#>  4     4  2     22.8 141.     95  3.92  3.15  22.9     1     0     4
#>  5     4  1     32.4  78.7    66  4.08  2.2   19.5     1     1     4
#>  6     4  2     30.4  75.7    52  4.93  1.62  18.5     1     1     4
#>  7     4  1     33.9  71.1    65  4.22  1.84  19.9     1     1     4
#>  8     4  1     21.5 120.     97  3.7   2.46  20.0     1     0     3
#>  9     4  1     27.3  79      66  4.08  1.94  18.9     1     1     4
#> 10     4  2     26   120.     91  4.43  2.14  16.7     0     1     5
#> # ... with 25 more rows
Related