用 sub 或 gsub 替换整个列名

Replacing entire column name with sub or gsub

您好,如果列包含特定字符,我正在尝试替换列名。我正在尝试使用 gsub() 函数。但是这个函数只是替换字符串,我希望它们替换列名。从我的 df wide_data 我想将包含“NominalYieldCurve.SpotRate”的列名替换为“Spot_Rate”:

    names(wide_data) <- gsub("NominalYieldCurve.SpotRate", "Spot_Rate", names(wide_data))
    names(wide_data) <- gsub("CreditModel.SpotSpread", "Spot_Spread", names(wide_data))

原来的列名是Nominal.YieldCurve.SpotRate(Govt,10,5),gsub之后是Spot_Rate(Govt,10,5)。我需要它只是 Spot_Ratedplyr rename() 似乎不适合这个,按索引更改列名不适合我的用例。有任何想法吗?谢谢!

您可以在此处使用 grepl

names(wide_data) <- ifelse(grepl("NominalYieldCurve.SpotRate", names(wide_data), fixed=TRUE),
                           "SpotRate", names(wide_data))
names(wide_data) <- ifelse(grepl("CreditModel.SpotSpread", names(wide_data), fixed=TRUE),
                           "SpotSpread", names(wide_data))

这是使用 rename_with 和选择助手 starts_withtidyverse 解决方案。

library(tidyverse)

wide_data <- data.frame(
  `NominalYieldCurve.SpotRate(Govt,10,5)` = 1,
  CreditModel.SpotSpread123 = 1
)

wide_data %>%
  rename_with(~"Spot_Rate", .cols = starts_with("NominalYieldCurve.SpotRate")) %>%
  rename_with(~"Spot_Spread", .cols = starts_with("CreditModel.SpotSpread"))
#>   Spot_Rate Spot_Spread
#> 1         1           1

您可以使用 base R 试试这个:

> names(wide_data)
[1] "NominalYieldCurve.SpotRate" "CreditModel.SpotSpread"
> names(wide_data)[names(wide_data) == 'NominalYieldCurve.SpotRate'] <- 'Spot_Rate'
> names(wide_data)[names(wide_data) == 'CreditModel.SpotSpread'] <- 'Spot_Spread'
> names(wide_data)
[1] "Spot_Rate"   "Spot_Spread"

您可以将正则表达式与 gsub() 一起使用,不仅可以替换 Nominal.YieldCurve.SpotRate,还可以替换列名称中它之前或之后的任何内容:

names(wide_data) <- gsub("^.*Nominal[.]YieldCurve[.]SpotRate.*$", "Spot_Rate", names(wide_data))
names(wide_data) <- gsub("^.*CreditModel[.]SpotSpread.*$", "Spot_Spread", names(wide_data))

对于 R 中的任何正则表达式模式,您必须使用 \. 来表示文字 .。此外,如果您想完全替换它们,还必须捕获名称中的其他字符.试试这个

names(wide_data) <- gsub(".*Nominal\.YieldCurve\.SpotRate.*", "Spot_Rate", names(wide_data))
names(wide_data) <- gsub("*CreditModel\.SpotSpread.*", "Spot_Spread", names(wide_data))