# Mean per group in a data.frame

181

I have a `data.frame` and I need to calculate the mean per group (i.e. per `Month`, below).

``````Name     Month  Rate1     Rate2
Aira       1      12        23
Aira       2      18        73
Aira       3      19        45
Ben        1      53        19
Ben        2      22        87
Ben        3      19        45
Cat        1      22        87
Cat        2      67        43
Cat        3      45        32
``````

My desired output is like below, where the values for `Rate1` and `Rate2` are the group means. Please disregard the value, I have made it up for the example.

``````Name       Rate1       Rate2
Aira        23.21       12.2
Ben         45.23       43.9
Cat         33.22       32.2
``````

This question is tagged with `r` `aggregate`

~ Asked on 2014-02-24 08:56:59

### The Best Answer is

273

This type of operation is exactly what `aggregate` was designed for:

``````d <- read.table(text=
'Name     Month  Rate1     Rate2
Aira       1      12        23
Aira       2      18        73
Aira       3      19        45
Ben        1      53        19
Ben        2      22        87
Ben        3      19        45
Cat        1      22        87
Cat        2      67        43
Cat        3      45        32', header=TRUE)

aggregate(d[, 3:4], list(d\$Name), mean)

Group.1    Rate1    Rate2
1    Aira 16.33333 47.00000
2     Ben 31.33333 50.33333
3     Cat 44.66667 54.00000
``````

Here we aggregate columns 3 and 4 of data.frame `d`, grouping by `d\$Name`, and applying the `mean` function.

Or, using a formula interface:

``````aggregate(. ~ Name, d[-2], mean)
``````

~ Answered on 2014-02-24 09:01:06

60

Or use `group_by` & `summarise_at` from the `dplyr` package:

``````library(dplyr)

d %>%
group_by(Name) %>%
summarise_at(vars(-Month), funs(mean(., na.rm=TRUE)))

# A tibble: 3 x 3
Name  Rate1 Rate2
<fct> <dbl> <dbl>
1 Aira   16.3  47.0
2 Ben    31.3  50.3
3 Cat    44.7  54.0
``````

See `?summarise_at` for the many ways to specify the variables to act on. Here, `vars(-Month)` says all variables except `Month`.

~ Answered on 2015-02-23 15:25:45