amisos55
amisos55

Reputation: 1979

How to replace columns names based on a column_map objects between two dataframes in R

I have two data frames and I need replace the column names of the first dataset based on a column_map that describes a mapping to replace column names.

Here is how my sample dataset looks like.

  dat.1 <- data.frame(column_1 = c(1:5),
                      column_2 = c(1:5),
                      column_3 = c(1:5),
                      column_4 = c(1:5))

> dat.1
  column_1 column_2 column_3 column_4
1        1        1        1        1
2        2        2        2        2
3        3        3        3        3
4        4        4        4        4
5        5        5        5        5

dat.2 <- data.frame(column_1a = c(1:5),
                    column_2b = c(1:5),
                    column_3c = c(1:5))

> dat.2
  column_1a column_2b column_3c
1         1         1         1
2         2         2         2
3         3         3         3
4         4         4         4
5         5         5         5

column_map <- data.frame(name.1 = c("column_1", "column_2", "column_3"),
                         name.2 = c("column_1a", "column_2b", "column_3c"))

> column_map
    name.1    name.2
1 column_1 column_1a
2 column_2 column_2b
3 column_3 column_3c

So, for example, I need to switch column_1 in dat.1 to column_1a and so on based on the column_map.

Edit: I would like to keep the fourth column column_4 as it is since it is not mapped (no equivalence in the second dataset).

The desired output would be:

> dat.1
  column_1a column_2b column_3c column_4
1         1         1         1     1
2         2         2         2     2
3         3         3         3     3
4         4         4         4     4
5         5         5         5     5

Thanks for looking into this!

Upvotes: 0

Views: 294

Answers (1)

Humpelstielzchen
Humpelstielzchen

Reputation: 6441

You could do it like that.

colnames(dat.1) <- column_map[match(colnames(dat.1), column_map[,1]), 2]

> dat.1
  column_1a column_2b column_3c
1         1         1         1
2         2         2         2
3         3         3         3
4         4         4         4
5         5         5         5

EDIT:

Regarding your edit you can use setnames() from data.table-package.

setnames(dat.1, old = column_map$name.1, new = column_map$name.2, skip_absent = T)

> dat.1
  column_1a column_2b column_3c column_4
1         1         1         1        1
2         2         2         2        2
3         3         3         3        3
4         4         4         4        4
5         5         5         5        5

Upvotes: 1

Related Questions