Reputation: 1979
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
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