# Mean by Group in R (2 Examples) | dplyr Package vs. Base R

In this tutorial you’ll learn how to compute the mean by group in the R programming language.

I’ll show two different alternatives including reproducible R codes.

Let’s dig into it!

## Example Data

For the following examples, I’m going to use the Iris Flower data set. Let’s load the data to R:

```data(iris) # Load Iris data head(iris) # First rows of Iris```

Table 1: The Iris Data Matrix.

As you can see based on Table 1, the Iris Flower data contains four numeric columns as well as the grouping factor column Species

Next, I’ll show you how to calculate the average for each of these groups. Keep on reading!

## Example 1: Compute Mean by Group in R with aggregate Function

The first example shows how to calculate the mean per group with the aggregate function.

We can compute the mean for each species of the Iris Flower data by applying the aggregate function as follows:

```aggregate(x = iris\$Sepal.Length, # Specify data column by = list(iris\$Species), # Specify group indicator FUN = mean) # Specify function (i.e. mean)   # Group.1 x # setosa 5.006 # versicolor 5.936 # virginica 6.588```

The RStudio console output shows the mean by group: The setosa group has a mean of 5.006, the versicolor group has a mean of 5.936, and the virginica group has a mean of 6.588.

Note: By replacing the FUN argument of the aggregate function, we can also compute other metrics such as the median, the mode, the variance, or the standard deviation.

## Example 2: Compute Mean by Group with dplyr Package

It’s definitely a matter of taste, but many people prefer to use the dplyr package to compute descriptive statistics such as the mean. This example shows how to get the mean by group based on the dplyr environment.

Let’s install and load the dplyr package to R:

```install.packages("dplyr") # Install dplyr package library("dplyr") # Load dplyr package```

Now, we can use all the functions of the dplyr package – in our case group_by and summarise_at:

```iris %>% # Specify data frame group_by(Species) %>% # Specify group indicator summarise_at(vars(Sepal.Length), # Specify column list(name = mean)) # Specify function   # A tibble: 3 x 2 # Species Sepal.Length # <fct> <dbl> # setosa 5.01 # versicolor 5.94 # virginica 6.59```

The output of the previous R syntax is a tibble instead of a data.frame. However, the results are the same as in Example 1.

## Further Resources & Summary

This tutorial illustrated how to compute group means in the R programming language. In case you want to learn more about the theoretical research concept of the mean, I can recommend the following video of the mathantics YouTube channel:

Furthermore, you could also have a look at some of the related R tutorials that I have published on my website:

I hope you found the tutorial helpful. However, if you have any questions or comments, don’t hesitate to let me know below.

• Ruben Angulo
July 24, 2019 5:27 pm

After I used the dplyr option I’ve got this warning message

funs() is soft deprecated as of dplyr 0.8.0
# Before:
funs(name = f(.))
# After:
list(name = ~ f(.))

So, maybe you could update the example code as:

iris%>%
group_by(Species)%>%
summarise_at(vars(Sepal.Length), list(name=mean))

Regards!

• Hey Ruben,

Thank you for the hint, I’ve just changed the code accordingly 🙂

Regards,

Joachim

• Hi! I’m fairly new to using R, after finding the mean values of two categorical groups I have how would I plot those means in a bar chart? Thank you

• Thank you so much for the easy to follow instructions! I’ve been working on project since last week for my job and this cleared everything up for me in 5 minutes! Thank you!!!

• Thanks so much for this! It was very helpful 🙂

• Thank you for these instructions – very helpful! I am wondering if the output for the dplyr method is rounded? If so, is there a way for the output to not be rounded like the aggregate function?

Thanks!

• Hi Jan,

Thank you for the comment and the kind words!

Actually, this is a very good question! The dplyr package returns the data in tibble format (in contrast to the data.frame format returned by the aggregate function). Tibbles automatically display the data rounded to two digits. However, the actual values stored in the tibble are NOT rounded.

You can see that by converting the tibble back to data.frame format:

```iris %>% # Specify data frame group_by(Species) %>% # Specify group indicator summarise_at(vars(Sepal.Length), # Specify column list(name = mean)) %>% # Specify function as.data.frame() # Convert tibble to data.frame # Species name # 1 setosa 5.006 # 2 versicolor 5.936 # 3 virginica 6.588```

I also found this thread, which is discussing this topic in some more detail.

I hope that helps!

Joachim