如何根据 R 中两个数据帧之间的 column_map 对象替换列名

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

我有两个数据框,我需要根据描述替换列名的映射的 column_map 替换第一个数据集的列名。

这是我的示例数据集的样子。

  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

因此,例如,我需要根据 column_map.

dat.1 中的 column_1 切换为 column_1a 等等

编辑:我想保留第四列 column_4 因为它没有映射(第二个数据集中没有等价物)。

所需的输出为:

> 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

感谢您的关注!

你可以那样做。

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

编辑:

关于您的编辑,您可以使用 data.table-package 中的 setnames()

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