How to use order in R

base-r
order
Master order in R programming with clear examples. Complete tutorial covering syntax, use cases, and best practices.
Published

February 22, 2026

Introduction

The order() function in R returns the indices that would sort a vector or data frame in ascending or descending order. Unlike sort() which returns the actual sorted values, order() gives you the positions needed to rearrange your data, making it essential for sorting data frames and maintaining relationships between variables.

Getting Started

library(tidyverse)
data(mtcars)

Example 1: Basic Usage

The Problem

We need to understand how order() differs from sort() and why the position indices matter. Let’s start with a simple vector to see how order() identifies which elements should come first, second, third, and so on.

Step 1: Create a sample vector

We’ll start with a small numeric vector to clearly see how order() works.

# Create a simple vector
values <- c(45, 12, 67, 23, 89, 34)
print(values)

This gives us a vector with 6 numbers in their original positions.

Step 2: Compare sort() vs order()

Let’s see the fundamental difference between these two functions.

# sort() returns the actual sorted values
sorted_values <- sort(values)
print(sorted_values)

# order() returns the positions/indices
position_indices <- order(values)
print(position_indices)

The sort() function gives us the values in order, while order() tells us that position 2 has the smallest value, position 4 has the second smallest, and so on.

Step 3: Use order() to manually sort

Now we’ll use the indices from order() to sort our original vector.

# Use the indices to sort manually
manually_sorted <- values[order(values)]
print(manually_sorted)

# Verify it matches sort()
identical(manually_sorted, sorted_values)

This demonstrates that values[order(values)] produces the same result as sort(values), but order() gives us more flexibility for complex sorting.

Example 2: Practical Application

The Problem

We have the mtcars dataset and want to sort cars by fuel efficiency (mpg) to find the most and least fuel-efficient vehicles. We also need to sort by multiple criteria to break ties meaningfully.

Step 1: Sort by single column

Let’s find the most fuel-efficient cars by sorting the entire dataset by mpg.

# Sort mtcars by mpg (ascending order)
cars_by_mpg <- mtcars[order(mtcars$mpg), ]

# View the least efficient cars (first 3 rows)
head(cars_by_mpg, 3)

The order() function rearranged all rows so that cars with the lowest mpg appear first, keeping all vehicle information together.

Step 2: Sort in descending order

Now let’s find the most fuel-efficient cars by reversing the sort order.

# Sort by mpg in descending order
cars_best_mpg <- mtcars[order(mtcars$mpg, decreasing = TRUE), ]

# View the most efficient cars
head(cars_best_mpg, 3)

The decreasing = TRUE parameter gives us the highest mpg vehicles first, showing us the most fuel-efficient cars in our dataset.

Step 3: Sort by multiple columns

Let’s sort by number of cylinders first, then by mpg within each cylinder group.

# Sort by cyl first, then mpg within each cylinder group
cars_multi_sort <- mtcars[order(mtcars$cyl, mtcars$mpg), ]

# View the results
head(cars_multi_sort, 6)

This creates a hierarchy where cars are grouped by cylinder count, and within each group, they’re ordered by fuel efficiency.

Step 4: Modern approach with dplyr

Here’s how to achieve the same result using modern tidyverse syntax.

# Modern approach using arrange()
cars_modern <- mtcars |>
  arrange(cyl, mpg) |>
  head(6)

print(cars_modern)

The arrange() function internally uses similar logic to order() but provides a more readable syntax for data frame operations.

Summary

  • order() returns position indices rather than sorted values, making it perfect for sorting entire data frames
  • Use order(x) for ascending sort and order(x, decreasing = TRUE) for descending sort
  • Multiple columns can be sorted by providing additional arguments: order(col1, col2, col3)
  • data[order(data$column), ] is the base R way to sort data frames by specific columns
  • Modern tidyverse code uses arrange() which is more readable but order() remains essential for understanding R’s sorting mechanics