Search code examples
rdplyrrenamenames

Modify names only for some columns


I have a dataset like original.

id <- c(1,1,1,2,3,3,3,4,4)
period <- c(1,1,2,2,1,2,3,1,3)
iso_1 <- c(1,0,0,0,1,1,0,1,1)
iso_2 <- c(1,1,1,0,0,1,0,1,1)
iso_3 <- c(1,0,1,0,0,1,0,0,1)

original <- data.frame(id, period, iso_1, iso_2, iso_3)

I like to modify the column names that have a pattern "iso_name" and add "_exp", so it looks like "iso_name_exp". The new dataset looks as follows:

iso_1_exp <- c(1,0,0,0,1,1,0,1,1)
iso_2_exp <- c(1,1,1,0,0,1,0,1,1)
iso_3_exp <- c(1,0,1,0,0,1,0,0,1)
new <- data.frame(id, period, iso_1_exp, iso_2_exp, iso_3_exp)

I did try the following line:

n <- ncol(original)
colnames(original)[,3:n] <- paste0(colnames(original)[,3:n],"_exp")

However it didn't make the trick.

Any idea? Thank you


Solution

  • Using dplyr :

    library(dplyr)
    original %>% rename_with(~paste0(., '_exp'), starts_with('iso'))
    
    #  id period iso_1_exp iso_2_exp iso_3_exp
    #1  1      1         1         1         1
    #2  1      1         0         1         0
    #3  1      2         0         1         1
    #4  2      2         0         0         0
    #5  3      1         1         0         0
    #6  3      2         1         1         1
    #7  3      3         0         0         0
    #8  4      1         1         1         0
    #9  4      3         1         1         1
    

    Base R :

    cols <- grep('^iso', names(original))
    names(original)[cols] <- paste0(names(original)[cols], '_exp')