重命名列名的后缀部分,但保持其余部分相同
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.1
、Attribute1.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"))
如果不是Attribute1
和Attribute2
,您可能有一些带有点/空格的名称,您也可以将"\\.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"
【讨论】:
以上是关于重命名列名的后缀部分,但保持其余部分相同的主要内容,如果未能解决你的问题,请参考以下文章
R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)