如何在R tidyverse中解析含字符与年份的列名并转换格式
用tidyverse批量重命名列名:提取年份后两位并格式化
以下是两种实用的实现方法,适配不同的列名场景:
场景1:字符部分不含空格(如"var 1975")
直接用正则表达式批量替换,简洁高效:
library(tidyverse) # 测试数据 df <- tibble( "var 1975" = 1:3, "var 1976" = 4:6, "metric 2020" = 7:9 ) # 重命名列 df_clean <- df %>% rename_with(~ str_replace(., "^(.*) (\\d{2})(\\d{2})$", "\\1_\\3")) # 查看结果 colnames(df_clean) #> [1] "var_75" "var_76" "metric_20"
代码解释:
rename_with():tidyverse中用于批量修改列名的函数,接收一个自定义处理函数str_replace():正则替换逻辑^(.*):捕获空格前的所有字符(如"var"、"metric")到第一个捕获组(\\d{2})(\\d{2})$:把四位年份拆成前两位(如"19")和后两位(如"75"),后两位对应第三个捕获组\\1_\\3:将字符部分与年份后两位用下划线连接
场景2:字符部分可能包含空格(如"my var 1975")
如果字符部分有空格,拆分提取的方法更稳妥:
df <- tibble( "my var 1975" = 1:3, "sales data 2008" = 4:6 ) df_clean <- df %>% rename_with(~ { # 提取空格前的字符部分(排除最后四位年份) char_part <- str_extract(., "^.*(?= \\d{4})") # 提取年份后两位 year_part <- str_extract(., "\\d{4}$") %>% str_sub(-2, -1) # 拼接成新列名 str_c(char_part, year_part, sep = "_") }) colnames(df_clean) #> [1] "my var_75" "sales data_08"
代码解释:
str_extract(., "^.*(?= \\d{4})"):用正向预查匹配所有在"空格+四位年份"之前的内容str_sub(-2, -1):从四位年份字符串中截取最后两位str_c():将字符部分和年份后两位用下划线拼接
内容的提问来源于stack exchange,提问作者saddas
相关产品推荐
相关产品推荐

