Using a numlist loop when renaming variables

Viewed 119

I´m trying to rename two types of variables in R using tidyverse/dplyr. The first type "var_a_year", I want to rename it as "sample_year". The second type of variable "var_b_7", I want to rename it as "index_year".

The second variable, "var_b" starts on the number 7 for the first year "2004". And increases by 2 for each year. So for year 2005, the second type variable is called "var_b_9" as shown.

I would like to use a loop so I can make this faster instead of writting a line for each year.

Many thanks in advance!

df <- df %>% 
    rename(
      sample_2004 = var_a_2004, index_2004 = var_b_7,
      sample_2005 = var_a_2005, index_2005 = var_b_9,
      sample_2006 = var_a_2006, index_2006 = var_b_11,
      sample_2007 = var_a_2007, index_2007 = var_b_13,
      ...
      sample_2020 = var_a_2020, index_2020 = var_b_39)
2 Answers

There's no need to use a loop. rename_with will do the trick:

df <- tibble(var_a_2004=NA, var_b_7=NA, var_a_2005=NA, var_b_8=NA)

renameA <- function(x) {
  return(paste0("sample_", stringr::str_sub(x, -4)))
}

df %>% rename_with(renameA, starts_with("var_a"))

Gives

# A tibble: 1 x 4
  sample_2004 var_b_7 sample_2005 var_b_8
  <lgl>       <lgl>   <lgl>       <lgl>  
1 NA          NA      NA          NA

I'll leave you to work out how to code the corresponding function for your var_b_XXXX columns.

In addition to the answer of Limey:

#sample data
df <- structure(list(var_a_2004 = NA, var_b_7 = NA, var_a_2005 = NA, 
    var_b_9 = NA), row.names = c(NA, -1L), class = "data.frame")

#load data.table package
library(data.table)

#set df to data.table
dt <- as.data.table(df)

#convert var_a in columnnames to sample_
colnames(dt) <- gsub("var_a_", "sample_", colnames(dt))

#use a loop to replace var_b to index_
for(i in 2004:2005){
  year <- i
  nr <- 2* i -4001
  setnames(dt, old = paste0("var_b_", nr), new = paste0("index_", year))
}

This function now works for the years 2004:2005 to match the sample data. You can change it to 2004:2020 for your dataset.

Related