用 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_Rate
。 dplyr 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_with
的 tidyverse
解决方案。
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))
您好,如果列包含特定字符,我正在尝试替换列名。我正在尝试使用 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_Rate
。 dplyr 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_with
的 tidyverse
解决方案。
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))