How to Select All But One Column in R

Spread the love


The R programming language, commonly used in statistical computing and graphics, offers users powerful tools for manipulating data frames. It’s often necessary to select specific columns from a data frame for further analysis. This article will focus on one common scenario: how to select all columns from a data frame but one. We will cover four different methods – using negative indexing, the subset() function, and two powerful R packages, dplyr and purrr.

Basic Concepts

Before diving into the methods, let’s discuss some fundamental concepts about data frames and subsetting in R.

A data frame in R is a type of object that can store data in the form of a table. Each column can contain data of different types (e.g., numeric, factor, character), but each row should contain data of the same type.

Subsetting is the act of selecting specific rows and columns from a data frame. There are several ways to do this in R, using functions such as subset(), select(), and direct indexing.

Selecting Columns in R

To select a column in R, we can use the $ operator or the double square bracket [[ ]]. For example, if we have a data frame called df and we want to select a column named ‘Age’, we could do:




We can also use the single square brackets [ ] for selecting columns. The difference is that this operator will return a data frame, while the previous two will return a vector. If we want to select the ‘Age’ column as a data frame, we could do:

df[, 'Age']

The , character is used to separate rows and columns. The previous line will select all rows (:) for the ‘Age’ column.

Now that we know how to select a column, let’s see how to select all but one.

Method 1: The Negative Index Method

The first method involves using negative indices. In R, negative indices can be used to exclude certain elements. For instance, if we have a vector v = c(1, 2, 3, 4, 5), we can exclude the second element using negative indexing like so: v[-2], which will return 1 3 4 5.

To exclude a column, we need to find its index first. We can use the which() function for this purpose. This function will return the index of the elements that match a condition.

Assume we have a data frame df and we want to exclude the ‘Age’ column. First, we need to find the index of the ‘Age’ column.

index <- which(names(df) == 'Age')

Now we can use this index to exclude the ‘Age’ column.

df_excl_age <- df[,-index]

Method 2: The Subset Function

The subset() function is a powerful function in R for subsetting data frames. This function has two main arguments: the data frame and the subset condition.

However, the subset() function also allows us to specify which columns to keep using the select argument. We can use the - operator to indicate the columns to exclude.

Here’s how to exclude the ‘Age’ column using the subset() function.

df_excl_age <- subset(df, select = -Age)

Method 3: Using the dplyr Package

dplyr is a powerful package in R for data manipulation. It offers several functions to manipulate data frames, including the select() function, which can be used to select columns.

Like the subset() function, the select() function of the dplyr package also accepts negative indices to exclude columns. However, we need to use the one_of() function to create the indices.

First, we need to install and load the dplyr package.


Now we can use the select() function to exclude the ‘Age’ column.

df_excl_age <- select(df, -one_of('Age'))

Note that the select() function will return a new data frame. If we want to modify the original data frame, we can use the select_() function instead.

select_(df, .dots = -one_of('Age'))

Method 4: Using the purrr package

The purrr package is part of the tidyverse, and it provides a complete and consistent set of tools for working with functions and vectors. One of the core principles of purrr is to provide straightforward ways to iterate over vectors and lists.

First, install and load the purrr package.


In purrr, there’s a function called discard() that can remove elements from a list (or a data frame, since a data frame is technically a list of vectors) based on a predicate function. In other words, discard() allows us to remove elements that meet a certain condition.

So, to remove a specific column from a data frame, we could use discard() with a predicate function that checks the column names. Here’s how you’d do it:

df_excl_age <- df %>% discard(~ .x %in% "Age")

The .x in the predicate function refers to each element of the data frame, and %in% "Age" checks if the element (a column, in this case) is “Age”. The result is a new data frame without the “Age” column.


There are several ways to select all but one column in a data frame in R. Each method has its strengths and weaknesses, and the best one to use depends on the specific scenario and personal preference.

The Negative Index method is a simple and quick way that works well for small data frames but might not be as efficient for large ones. The Subset function and dplyr package provide more powerful and flexible ways, and they integrate well with other functions from base R and the tidyverse, respectively. The purrr package provides a functional programming approach, which can be more intuitive and easier to read, especially for complex operations.

All these methods offer the same basic functionality: to help you select all but one column from a data frame. Your choice depends on your specific needs, your comfort level with each method, and the complexity of your data manipulation tasks. Understanding all these methods can give you more tools to tackle your data manipulation tasks in R effectively.

Posted in RTagged

Leave a Reply