How to rename columns in a data frame in R

· 2 min read · Updated March 14, 2026 · beginner
r dplyr data-table column-rename

Renaming columns is a frequent data cleaning task. Here are several ways to do it.

With dplyr

The tidyverse approach uses rename() or select():

library(dplyr)

# Rename using rename()
df <- rename(df, new_name = old_name)

# Rename multiple columns
df <- rename(df, 
  new_name1 = old_name1,
  new_name2 = old_name2
)

Use rename_with() to rename by function:

# Convert column names to uppercase
df <- rename_with(df, toupper)

# Rename columns that start with "x"
df <- rename_with(df, ~ paste0("prefix_", .x), starts_with("x"))

With base R

Base R has several ways to rename columns:

# Using names() function
names(df)[names(df) == "old_name"] <- "new_name"

# Using colnames()
colnames(df)[colnames(df) == "old_name"] <- "new_name"

# Rename by position
names(df)[1] <- "new_first_column"

For multiple columns at once:

old_names <- c("old1", "old2", "old3")
new_names <- c("new1", "new2", "new3")

# Create a named vector for exact replacement
names(new_names) <- old_names

# Apply rename
names(df) <- ifelse(names(df) %in% old_names, 
                    names(new_names)[names(df)], 
                    names(df))

With data.table

The data.table package offers fast renaming:

library(data.table)

dt <- as.data.table(df)

# Rename single column
setnames(dt, "old_name", "new_name")

# Rename multiple columns
setnames(dt, c("old1", "old2"), c("new1", "new2"))

# Rename by position
setnames(dt, 1, "new_first_column")

Rename vs Select

The choice between rename() and select() matters:

  • rename() keeps all columns, just changes names
  • select() lets you reorder and drop columns too
library(dplyr)

# rename() keeps everything
df %>% rename(employee_name = name)

# select() can reorder and drop
df %>% select(employee_name = name, everything())
df %>% select(new_name = old_name)  # drops other columns

Common Patterns

TaskdplyrBase Rdata.table
Rename onerename(new = old)names(df)[df == \"old\"] <- \"new\"setnames(dt, \"old\", \"new\")
Rename manyrename(new1 = old1, new2 = old2)Loop with names()setnames(dt, c(\"old1\", \"old2\"), c(\"new1\", \"new2\"))
Rename allrename_with(df, toupper)names(df) <- toupper(names(df))setnames(dt, toupper(names(dt)))

See Also