You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:53:13