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 namesselect()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
| Task | dplyr | Base R | data.table |
|---|---|---|---|
| Rename one | rename(new = old) | names(df)[df == \"old\"] <- \"new\" | setnames(dt, \"old\", \"new\") |
| Rename many | rename(new1 = old1, new2 = old2) | Loop with names() | setnames(dt, c(\"old1\", \"old2\"), c(\"new1\", \"new2\")) |
| Rename all | rename_with(df, toupper) | names(df) <- toupper(names(df)) | setnames(dt, toupper(names(dt))) |
See Also
- dplyr::select() — Select and rename columns
- dplyr::filter() — Filter rows
- dplyr::mutate() — Add or modify columns