重命名列名的后缀部分,但其余部分保持不变

Rename suffix part of column name but keep the rest the same

现在我正在重做合并,因为我对列的命名很糟糕,但是,我想知道如何匹配列名的后缀并重命名列的那一部分,同时保持其余部分不变。

例如,如果我有一个 data.frame(也可以是 data.table,没关系 - 我可以转换它):

d <- data.frame("ID" = c(1, 2, 3),
                "Attribute1.prev" = c("A", "B", "C"),
                "Attribute1.cur" = c("D", "E", "F"))

现在假设有数百列类似于我的示例 DT 中的第 2 列和第 3 列。我将如何检查并检测所有以 ".prev" 结尾的列更改为 ".1" 以及所有以 ".cur" 结尾的列更改为 ".2"?

因此,新的列名称将是:ID(不变)、Attribute1.1Attribute1.2 等等匹配的列。

我们可以用 base R 做

names(d) <- sub("\.prev", ".1", sub("\.cur", ".2", names(d)))
d
#   ID Attribute1.1 Attribute1.2
# 1  1            A            D
# 2  2            B            E
# 3  3            C            F

使用 stringr 软件包,您还可以使用

names(d) <- str_replace_all(names(d), c("\.prev" = ".1", "\.cur" = ".2"))

如果不是 Attribute1Attribute2,您可能有一些名称带有 dots/spaces,您也可以将 "\.prev""\.cur" 模式替换为 "\.prev$""\.cur$" 以确保我们在列名称的末尾匹配它们。

这是一个使用 dplyr & stringr 语法的想法

library(dplyr); library(stringr)
names(d) <- 
  d %>% names() %>% 
  str_replace(".prev", ".1") %>% 
  str_replace(".cur", ".2")

干杯!

这里有一个选项gsubfn

library(gsubfn)
names(d) <- gsubfn("(\w+)", list(prev = 1, cur = 2), names(d))
names(d)
#[1] "ID"           "Attribute1.1" "Attribute1.2"