How to Group and Summarize Data in R

Spread the love

Working with datasets often requires a combination of cleaning, grouping, and summarizing data to extract meaningful insights. R, a popular language for data analysis, offers powerful tools and packages to facilitate these tasks. This article provides an in-depth exploration of grouping and summarizing data in R.

1. Introduction: Why Group and Summarize?

Grouping and summarizing data is fundamental in data analysis. This process can help:

  • Identify patterns and trends.
  • Reduce the complexity of a dataset.
  • Facilitate comparisons across groups or categories.
  • Prepare data for visualization.

2. Base R Techniques

While R offers specialized packages for data manipulation, it’s essential to know how to group and summarize data using base R functions.

Using aggregate( )

The aggregate() function is a versatile tool for data summarization in base R:

# Sample data frame
data <- data.frame(
  category = c("A", "B", "A", "A", "B"),
  value = c(10, 20, 30, 40, 50)

# Summarizing the sum of values by category
result <- aggregate(value ~ category, data=data, FUN=sum)


  category value
1        A    80
2        B    70

3. The dplyr Approach

The dplyr package, part of the tidyverse, offers a set of powerful functions to group and summarize data elegantly.

Grouping with group_by( )

group_by() lets you define grouping variables. The resulting object, combined with other dplyr functions, allows for efficient manipulations.

Summarizing with summarize( )

After grouping, summarize() computes summary statistics for each group:


result <- data %>%
  group_by(category) %>%
  summarize(total_value = sum(value))



  category total_value
  <chr>          <dbl>
1 A                 80
2 B                 70

4. Summarization Functions in R

R offers various functions to extract summary statistics. Here’s an expanded list of summarization functions available in R:

Central Tendency

  1. mean(): Calculate the arithmetic mean.
  2. median(): Find the median (middle value) of a numeric vector.
  3. mode(): Though not directly available in base R, the mode (most frequently occurring value) can be computed using custom functions or specific packages like DescTools.

Spread / Dispersion

  1. sd(): Compute the standard deviation.
  2. var(): Calculate the variance.
  3. IQR(): Determine the Interquartile Range (difference between the upper and lower quartiles).
  4. range(): Get the range of values (min and max).

Count and Presence

  1. length(): Count the number of elements.
  2. n(): In the context of dplyr, this gives the count of rows.
  3. sum(): Compute the sum of elements.
  4. any(): Check if at least one element is TRUE.
  5. all(): Check if all elements are TRUE.

Quantiles and Percentiles

  1. quantile(): Obtain specified quantiles.
  2. percent_rank(): With dplyr, compute the relative rank of each value within a group.

Minimum and Maximum

  1. min(): Determine the smallest value.
  2. max(): Determine the largest value.


  1. first(): With dplyr, get the first value in a group.
  2. last(): With dplyr, get the last value in a group.
  3. nth(): With dplyr, obtain the nth value in a group.
  4. cumsum(): Calculate the cumulative sum.
  5. cumprod(): Calculate the cumulative product.
  6. cummin(): Calculate the cumulative minimum.
  7. cummax(): Calculate the cumulative maximum.

Handling NA Values

  1. sum( Count the number of missing values.
  2. mean(! Calculate the proportion of non-missing values.

Custom Functions

Remember, R is very extensible. You can easily write custom summarization functions using base R constructs and use them within grouping and summarizing frameworks, such as those provided by dplyr.

The above functions cover a wide range of summarization needs, from simple counts to more complex statistical measures.

These functions can be used within aggregate(), summarize(), and similar functions to compute grouped summaries.

5. Summarise on Multiple Columns in R

Imagine we have a dataset of sales transactions that includes the region, product, and sales amount for each transaction and cost column representing the cost of goods sold. We’ll group the data by region and then calculate the total sales, total cost, and average profit margin for each region.

Sample Data


# sales data frame
sales_data <- data.frame(
  region = c("East", "West", "East", "West", "East", "West", "East"),
  product = c("Apple", "Banana", "Apple", "Apple", "Banana", "Banana", "Apple"),
  sales = c(10, 15, 20, 25, 30, 35, 40),
  cost = c(5, 8, 14, 18, 22, 28, 30)  # Cost of goods sold


  region product sales cost
1   East   Apple    10    5
2   West  Banana    15    8
3   East   Apple    20   14
4   West   Apple    25   18
5   East  Banana    30   22
6   West  Banana    35   28
7   East   Apple    40   30

Grouping by Region and Summarizing on Multiple Columns

result <- sales_data %>%
  group_by(region) %>%
    total_sales = sum(sales),
    total_cost = sum(cost),
    avg_profit_margin = mean((sales - cost) / sales * 100)



  region total_sales total_cost avg_profit_margin
  <chr>        <dbl>      <dbl>             <dbl>
1 East           100         71              32.9
2 West            75         54              31.6

In this result:

  • We’ve grouped the data by region.
  • We’ve summarized the total sales using sum(sales).
  • We’ve summarized the total cost using sum(cost).
  • We’ve calculated the average profit margin for each region.

By using dplyr, we can easily group data by one or multiple columns and then summarize based on several columns, facilitating a comprehensive analysis of our dataset.

Let’s quickly see an example of grouping by multiple columns. Let’s group the data by both region and product and then compute the total sales for each combination.

result <- sales_data %>%
  group_by(region, product) %>%
  summarize(total_sales = sum(sales))



  region product total_sales
  <chr>  <chr>         <dbl>
1 East   Apple            70
2 East   Banana           30
3 West   Apple            25
4 West   Banana           50

6. Summarise All Columns Except Group by Columns

The dplyr package in R provides the summarise_all() function, which allows you to apply a function to all columns in a dataframe, excluding the grouping variables. However, in the latest versions of dplyr, summarise_all() is superseded by across() which offers more flexibility.

I’ll provide an example using both methods:

Sample Data


# Sample data frame
df <- data.frame(
  group = c("A", "A", "B", "B", "C", "C"),
  value1 = c(1, 2, 3, 4, 5, 6),
  value2 = c(6, 5, 4, 3, 2, 1)


  group value1 value2
1     A      1      6
2     A      2      5
3     B      3      4
4     B      4      3
5     C      5      2
6     C      6      1

Using summarise_all( ) (older dplyr versions)

To compute the mean of all columns except the grouping variable:

result_summarise_all <- df %>%
  group_by(group) %>%
  summarise_all(.funs = mean)



  group value1 value2
  <chr>  <dbl>  <dbl>
1 A        1.5    5.5
2 B        3.5    3.5
3 C        5.5    1.5

Using across( ) (latest dplyr versions)

To compute the mean of all columns except the grouping variable using the newer approach:

result_across <- df %>%
  group_by(group) %>%
  summarise(across(everything(), mean))



  group value1 value2
  <chr>  <dbl>  <dbl>
1 A        1.5    5.5
2 B        3.5    3.5
3 C        5.5    1.5

The result shows the mean of each value column for each group. With these methods, you can apply summary functions to all columns in a dataframe, excluding those used for grouping. While doing this make sure your dataframe has only numeric columns plus grouping columns. Having non-numeric on summarise returns an error.

7. Visualizing Summaries

After summarizing data, visualization helps in interpretation:

Let’s use th sales_data to generate visual summaries after summarizing the data. We’ll use the ggplot2 package for this purpose.

We’ll visualize the following:

  1. Total sales by region.
  2. Total sales by product.
  3. Profit margin by region.


Ensure you have the ggplot2 library installed and loaded:


1. Total Sales by Region

First, we’ll summarize the sales data by region:

sales_by_region <- sales_data %>%
  group_by(region) %>%
  summarize(total_sales = sum(sales))

ggplot(sales_by_region, aes(x=region, y=total_sales, fill=region)) +
  geom_bar(stat="identity", position="dodge") +
  labs(title="Total Sales by Region", y="Total Sales") +

2. Total Sales by Product

Next, we’ll summarize the sales data by product:

sales_by_product <- sales_data %>%
  group_by(product) %>%
  summarize(total_sales = sum(sales))

ggplot(sales_by_product, aes(x=product, y=total_sales, fill=product)) +
  geom_bar(stat="identity", position="dodge") +
  labs(title="Total Sales by Product", y="Total Sales") +

3. Profit Margin by Region

Profit margin is given by (sales - cost) / sales. We’ll compute this for each region:

profit_margin_by_region <- sales_data %>%
  group_by(region) %>%
  summarize(profit_margin = mean((sales - cost) / sales))

ggplot(profit_margin_by_region, aes(x=region, y=profit_margin, fill=region)) +
  geom_bar(stat="identity", position="dodge") +
  labs(title="Profit Margin by Region", y="Profit Margin") +
  theme_minimal() +

These plots provide a clear visualization of the summarized sales data, helping to quickly and effectively interpret patterns and insights.


Grouping and summarizing data are foundational steps in the data analysis journey. The power of R lies not just in its statistical prowess but also in its ability to reshape and summarize data seamlessly. Whether you’re employing base R’s robust built-in functions or leveraging the elegant and readable syntax of the dplyr package, R equips you with the capability to handle data with precision and clarity. These methods enable data enthusiasts, from beginners to seasoned professionals, to distill large datasets into actionable insights. By mastering the art of data summarization in R, one unlocks the potential to uncover trends, make data-driven decisions, and weave compelling data narratives.

Posted in RTagged

Leave a Reply