The which() Function in R


Steven P. Sanderson II, MPH


May 18, 2023


As a programmer, one of the most important tasks is to extract valuable insights from data. To make this process efficient, it is crucial to have a reliable tool at your disposal. Enter the which() function in R. This versatile function allows you to locate specific elements within a vector or a data frame, helping you filter and analyze data with ease. In this blog post, we’ll explore the ins and outs of the which() function, discussing its syntax, common use cases, and providing practical examples to solidify your understanding.

Understanding the Syntax:

Before diving into real-world examples, let’s grasp the basic syntax of the which() function. The general structure of the function is as follows:

which(logical_vector, arr.ind = FALSE)

The logical_vector parameter represents the condition or logical expression you want to evaluate. It can be any expression that returns a logical vector, such as a comparison or logical operation. The optional arr.ind parameter, when set to TRUE, returns the result in array indices instead of a vector, that is to say that the which() function will return a vector of integers that correspond to the positions of the elements in the vector that satisfy the condition.

Example 1: Locating Elements in a Numeric Vector

Suppose we have a numeric vector called scores, representing test scores of students. We want to find the indices of scores greater than or equal to 90. Here’s how we can accomplish that using the which() function:

scores <- c(85, 92, 88, 94, 79, 91, 87, 98, 84, 90)
indices <- which(scores >= 90)
[1]  2  4  6  8 10

In this example, the which() function evaluates the logical expression scores >= 90 and returns the indices of the elements satisfying the condition. The resulting indices vector will contain [2, 4, 6, 8, 10], indicating the positions of the scores that meet the criteria.

Example 2: Filtering Data Frames

Data frames are widely used in data analysis. The which() function can be incredibly useful when working with data frames to filter rows based on specific conditions. Consider the following example:

data <- data.frame(Name = c("Alice", "Bob", "Charlie", "Dave"),
                   Age = c(25, 32, 28, 30),
                   City = c("New York", "London", "Paris", "Sydney"))

selected_rows <- which(data$Age >= 30)
filtered_data <- data[selected_rows, ]
  Name Age   City
2  Bob  32 London
4 Dave  30 Sydney

In this case, we use the which() function to find the rows where the Age column is greater than or equal to 30. The selected_rows vector will hold the indices [2, 4], which we subsequently use to filter the original data frame. The resulting filtered_data will contain the rows corresponding to the selected indices, in this case, rows for Bob and Dave.

Example 3: Using the arr.ind Parameter

The arr.ind parameter of the which() function comes in handy when working with multi-dimensional arrays. It allows you to obtain the indices as an array instead of a vector. Let’s illustrate this with an example:

matrix_data <- matrix(1:12, nrow = 3, ncol = 4)
selected_indices <- which(matrix_data %% 3 == 0, arr.ind = TRUE)
     row col
[1,]   3   1
[2,]   3   2
[3,]   3   3
[4,]   3   4

In this example, we create a matrix called matrix_data and use the which() function to find the indices where the matrix elements are divisible by 3. By setting arr.ind = TRUE, we obtain a matrix of indices, where each row represents the position of an element satisfying the condition.


The which() function in R proves to be an invaluable tool for data exploration and filtering. By allowing you to locate specific elements in vectors or data frames, it simplifies the process of extracting relevant information from your data. Throughout this blog post, we explored the syntax and various practical examples of using the which() function. Armed with this knowledge, you can now confidently apply the which() function to your own data analysis tasks in R, boosting your productivity and uncovering hidden insights with ease.