重命名列名的后缀部分,但保持其余部分相同

Posted

技术标签:

【中文标题】重命名列名的后缀部分,但保持其余部分相同【英文标题】:Rename suffix part of column name but keep the rest the same 【发布时间】:2019-05-12 21:15:06 【问题描述】:

现在我正在重做合并,因为我对列的命名不正确,但是,我想知道如何匹配列名的后缀并重命名列的该部分,保持其余部分相同。

例如,如果我有一个 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 等等,以匹配尽可能多的列。

【问题讨论】:

【参考方案1】:

使用基数 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,您可能有一些带有点/空格的名称,您也可以将"\\.prev""\\.cur" 模式替换为"\\.prev$""\\.cur$",以确保我们匹配它们位于列名的末尾。

【讨论】:

stringr 会更快吗? 你真的需要速度吗? 100 列的时间应该可以忽略不计。我刚刚对一个有 100,000 列的框架进行了基准测试,并且执行 Julius 的 double-dubsub 重命名不到 0.1 秒。您的时间可能会花在更耗时的操作上。 @Bear,我同意 r2evans,但您可能会看到,例如,***.com/a/29275120/1320535 以了解速度差异。【参考方案2】:

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

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

干杯!

【讨论】:

【参考方案3】:

这是gsubfn的选项

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

【讨论】:

以上是关于重命名列名的后缀部分,但保持其余部分相同的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名我的包裹?智能

如何以编程方式重命名 AWS Glue 目录中的列名

重命名服务器目录上的图像文件

R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)

WordPress 实现附件上传自动重命名但不改变附件标题

在 Linux 上重命名多个文件,同时保持相同的扩展名