How to Calculate Mode by Group in R (With Examples)

To calculate the mode by group in R, you can use the aggregate() or tapply() functions. The mode is the most frequently occurring value in a group of data, and the aggregate() and tapply() functions can be used to calculate the mode of each group in a data frame. Examples of how to use these functions to calculate the mode by group in R are provided.


The of a dataset represents the most frequently occurring value.

The statistical software R does not have a built-in function to calculate the mode of a dataset, but you can use the following function to calculate the mode:

find_mode <- function(x) {
  u <- unique(x)
  tab <- tabulate(match(x, u))
  u[tab == max(tab)]
}

The following examples show how to use this function to calculate the mode by group in R.

Example 1: Calculate Mode by Group in R (One Mode)

Suppose we have the following data frame in R that shows the points scored by basketball players on various teams:

#define data frama
df <- data.frame(team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'),
                 points=c(5, 7, 7, 9, 12, 12, 10, 14))

#view data frame
df

  team points
1    A      5
2    A      7
3    A      7
4    A      9
5    B     12
6    B     12
7    B     10
8    B     14

We can use the following code to calculate the mode of points, grouped by team:

library(dplyr)

#define function to calculate mode
find_mode <- function(x) {
  u <- unique(x)
  tab <- tabulate(match(x, u))
  u[tab == max(tab)]
}

#calculate mode of 'points' by 'team'
df %>%
  group_by(team) %>%
  summarize(mode_points = find_mode(points))

# A tibble: 2 x 2
  team  mode_points
         
1 A               7
2 B              12

From the results we can see:

  • The mode of points for team A is 7.
  • The mode of points for team B is 12.

Example 2: Calculate Mode by Group in R (Multiple Modes)

Suppose we have the following data frame in R:

#define data frama
df <- data.frame(team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'),
                 points=c(5, 7, 7, 9, 12, 12, 10, 10))

#view data frame
df

  team points
1    A      5
2    A      7
3    A      7
4    A      9
5    B     12
6    B     12
7    B     10
8    B     10

We can use the following code to calculate the mode of points, grouped by team:

library(dplyr)

#define function to calculate mode
find_mode <- function(x) {
  u <- unique(x)
  tab <- tabulate(match(x, u))
  u[tab == max(tab)]
}

#calculate mode of 'points' by 'team'
df %>%
  group_by(team) %>%
  summarize(mode_points = find_mode(points))

# A tibble: 3 x 2
# Groups:   team [2]
  team  mode_points
         
1 A               7
2 B              12
3 B              10

From the results we can see:

  • The mode of points for team A is 7.
  • The mode of points for team B is 12 and 10.

In this example, there were two points values that occurred most frequently for team B, so each of these mode values is returned on a separate line for team B in the output.

The following tutorials explain how to calculate other descriptive statistics in R:

x