The which() Function in R

[This article was first published on Steve's Data Tips and Tricks, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.


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.

To leave a comment for the author, please follow the link and comment on their blog: Steve's Data Tips and Tricks. offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)