David Moore
David Moore

Reputation: 968

Renaming Several Columns in Data Frames Stored in a List Simultaneously

I have the following list, which contains several dataframes that all have the same column names:

my_list <- list(df1 = data.frame(A = c(1:3), B = c(4:6), C = c(7:9)), 
                df2 = data.frame(A = c(1:4), B = c(5:8), C = c(9:12)), 
                df3 = data.frame(A = c(1:5), B = c(6:10), C = c(11:15)))

Is there an efficient way to rename all of the column As in each data frame in the list simultaneously using base R functions?

I was thinking that something like

names(lapply(my_list, `[[`, "A")) <- "new_name"

may work, but I think I'm off track - the lapply function returns an object that might not work for what I'm trying to do.

Thanks!

Upvotes: 2

Views: 62

Answers (3)

dww
dww

Reputation: 31452

How about

new.names = c('New', 'B', 'C')
lapply(my_list, `names<-`, new.names)

For the added example in your edit, you would simply change this to

new.names = sub('B', 'New', names(my_list[[1]]))

Upvotes: 2

Gregor Thomas
Gregor Thomas

Reputation: 145775

A few more base options:

# rename first column name
lapply(my_list, function(x) setNames(x, replace(names(x), 1, "new_name_for_A")))

# rename column named "A"
lapply(my_list, function(x) setNames(x, replace(names(x), names(x) == "A", "new_name_for_A")))

# lowly for loop
for (i in seq_along(my_list)) {
  names(my_list[[i]])[names(my_list[[i]]) == "A"] = "new_name_for_A"
}

Upvotes: 2

akrun
akrun

Reputation: 887118

We can use map to loop over the list and rename the column named 'A' to 'new_name" with rename_at

library(purrr)
library(dplyr)
map(my_list, ~ .x %>% 
                   rename_at(vars("A"), ~ "new_name"))

Or with base R by making use of anonymous function call

lapply(my_list, function(x) {names(x)[names(x) == "A"] <- "new_name"; x})

Upvotes: 2

Related Questions