How to Find the Maximum Value by Group in R


Often you may want to find the maximum value of each group in a data frame in R. Fortunately this is easy to do using functions from the dplyr package.

This tutorial explains how to do so using the following data frame:

#create data frame
df <- data.frame(team = c('A', 'A', 'A', 'B', 'B', 'B', 'B'),
                 position = c('G', 'F', 'F', 'G', 'G', 'G', 'F'),
                 points = c(12, 15, 19, 22, 34, 34, 39))

#view data frame
df

  team position points
1    A        G     12
2    A        F     15
3    A        F     19
4    B        G     22
5    B        G     34
6    B        G     34
7    B        F     39

Example 1: Find Max Value by Group

The following code shows how to find the max value by team and position:

library(dplyr)

#find max value by team and position
df %>%
  group_by(team, position) %>%
  summarise(max = max(points, na.rm=TRUE))

# A tibble: 4 x 3
# Groups:   team [?]
  team   position   max
      
1 A      F         19.0
2 A      G         12.0
3 B      F         39.0
4 B      G         34.0

Example 2: Return Rows that Contains Max Value by Group

The following code shows how to return the rows that contain the max value by team and position:

library(dplyr)

#find rows that contain max points by team and position
df %>%
  group_by(team, position) %>%
  filter(points == max(points, na.rm=TRUE))

# A tibble: 5 x 3
# Groups:   team, position [4]
  team   position points
       
1 A      G          12.0
2 A      F          19.0
3 B      G          34.0
4 B      G          34.0
5 B      F          39.0

Example 3: Return a Single Row that Contains Max Value by Group

In the previous example, there were two players who had the max amount of points on team A who were both in position G. If you only want to return the first player with the max value in a group, you can use the slice() function as follows:

library(dplyr)

#find rows that contain max points by team and position
df %>%
  group_by(team, position) %>%
  slice(which.max(points))

# A tibble: 4 x 3
# Groups:   team, position [4]
  team   position points
       
1 A      F          19.0
2 A      G          12.0
3 B      F          39.0
4 B      G          34.0

Additional Resources

The Complete Guide: How to Group & Summarize Data in R
How to Filter Rows in R
How to Remove Duplicate Rows in R

Leave a Reply

Your email address will not be published.