Search code examples
rdataframedplyrrename

Updating the names in dataframe to keep the same always


While rbinding the all small tables, names of data frame having extentention ".x" , ".y" , ".xX", ".yY" etc. but I want to keep the same name in dataframe.

For example in my data frame below I want to keep the same column name "names" in data frame.

data <- data.frame(part=c("DD","MM","TT"),
Team1 = c("kamal", "vimal", "shamal"),
"names.x" = c(45,23,35),
Team2 = c("kamal", "vimal", "shamal"),
"names.y" = c(46,24,36),
Team3 = c("kamal", "vimal", "shamal"),
"names.x.x" = c(47,25,37),
Team2 = c("kamal", "vimal", "shamal"),
"names.y.y" = c(48,26,38),
age = c(45,23,35),
weight = c(50,34,42))

Required output should be look like below

enter image description here


Solution

  • You can use sub to only keep "names", then setNames to change the column names.

    setNames(data, sub("(names).*", "\\1", colnames(data)))
    
      part  Team1 names  Team2 names  Team3 names Team2.1 names age weight
    1   DD  kamal    45  kamal    46  kamal    47   kamal    48  45     50
    2   MM  vimal    23  vimal    24  vimal    25   vimal    26  23     34
    3   TT shamal    35 shamal    36 shamal    37  shamal    38  35     42
    

    Or remove anything after a dot ..

    setNames(data, sub("\\..*", "", colnames(data)))
    

    Another way of doing it is to use the colnames(data) <- syntax, which will immediately replace the column names in data (use with caution).

    colnames(data) <- sub("\\..*", "", colnames(data))
    

    Output

      part  Team1 names  Team2 names  Team3 names  Team2 names age weight
    1   DD  kamal    45  kamal    46  kamal    47  kamal    48  45     50
    2   MM  vimal    23  vimal    24  vimal    25  vimal    26  23     34
    3   TT shamal    35 shamal    36 shamal    37 shamal    38  35     42
    

    Update:

    To combine names with sequential numbers, do:

    colnames(data)[grepl("names", colnames(data))] <- paste0("names", seq_len(sum(grepl("names", colnames(data)))))
    
      part  Team1 names1  Team2 names2  Team3 names3 Team2.1 names4 age weight
    1   DD  kamal     45  kamal     46  kamal     47   kamal     48  45     50
    2   MM  vimal     23  vimal     24  vimal     25   vimal     26  23     34
    3   TT shamal     35 shamal     36 shamal     37  shamal     38  35     42