1

I have several data.frames df1, df2, df3, ... .

df1 <- data.frame(var1 = c("a", "b", "c"), var2 = c("a", "b", "c"), var3 = c("a", "b", "c"), var4 = c("a", "b", "c")) df2 <- data.frame(var1 = c("a", "b", "c"), var2 = c("a", "b", "c"), var3 = c("a", "b", "c"), var4 = c("a", "b", "c")) df3 <- data.frame(var1 = c("a", "b", "c"), var2 = c("a", "b", "c"), var3 = c("a", "b", "c"), var4 = c("a", "b", "c")) df4 <- data.frame(var1 = c("a", "b", "c"), var2 = c("a", "b", "c"), var3 = c("a", "b", "c"), var4 = c("a", "b", "c")) 

And I have a data.frame rename_vars which tells mich which variables in which data.frame should be renamed.

rename_vars <- data.frame(df = c("df1", "df1", "df3"), var = c("var1", "var3", "var1"), rename_to = c("var1x", "var3y", "var1z")) df var rename_to 1 df1 var1 var1x 2 df1 var3 var3y 3 df2 var1 var1z 

For example, in df1 the variable var1 should be renamed into var1x and var3 should be called var3x. In data.frame df2 variable var1 should be called var1z and so forth.

But how can I automate this process of renaming variables in different data.frames according to rename_vars?

Thanks for help!

3
  • Did you meant the second element of rename_vars as 'df2' Commented Nov 16, 2020 at 21:24
  • yes, exactly. I corrected it. Commented Nov 16, 2020 at 21:26
  • Your rename_vars third element is 'df3' based o the example Commented Nov 16, 2020 at 21:33

2 Answers 2

1

We split the 'rename_vars' data based on the 'df' column then loop over the list with map2 on the values from the names of the list (mget) and the 'lst1', and change the column names with rename_at. It is better to keep it in a list, but if we need to change the global individual objects, use list2env after naming the list ('out') with the object names

library(dplyr) library(purrr) lst1 <- split(rename_vars[-1], rename_vars$df) out <- map2(mget(names(lst1)), lst1, ~ { nm1 <- .y[[1]] nm2 <- .y[[2]] .x %>% rename_at(vars(nm1), ~ nm2)}) list2env(out, .GlobalEnv) 

-output

df1 # var1x var2 var3y var4 #1 a a a a #2 b b b b #3 c c c c df3 # var1z var2 var3 var4 #1 a a a a #2 b b b b #3 c c c c 

Or another option is !!! with rename

library(tibble) lst1 <- split(as.list(deframe(rename_vars[3:2])), rename_vars$df) list2env(map2(mget(names(lst1)), lst1, ~ .x %>% rename(!!! .y)), .GlobalEnv) 

Or using base R with a for loop and assign

for(i in seq_len(nrow(rename_vars))) { tmp1 <- get(rename_vars$df[i]) i1 <- match(rename_vars$var[i], names(tmp1)) names(tmp1)[i1] <- rename_vars$rename_to[i] assign(rename_vars$df[i], tmp1) } 
Sign up to request clarification or add additional context in comments.

Comments

1

setnames from data.table

library('data.table') for (dt in unique(rename_vars$df) ) { df_rows <- (rename_vars$df == dt) # get row indices matching data frame name old <- rename_vars$var[df_rows] # old names new <- rename_vars$rename_to[df_rows] # new names setDT(get(dt)) # convert to data table by reference setnames(get(dt), old, new) # set names by reference } 

Output:

names(df1) # [1] "var1x" "var2" "var3y" "var4" names(df2) # [1] "var1" "var2" "var3" "var4" names(df3) # [1] "var1z" "var2" "var3" "var4" 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.