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

在R语言中为字符与数字混合的列名添加前导零

解决R数据框列名中Nr后数字补前导零的问题

核心思路

通过正则表达式捕获Nr后的数字部分,将其格式化为4位带前导零的字符串,再替换回原列名。同时修正你之前错误的列选择逻辑(starts_with不支持正则匹配,需用matches)。

方法一:使用dplyr(rename_at/rename_with)

示例代码(rename_at)

library(dplyr)

# 构造测试数据框
df <- data.frame(
  Sample_ID = 1:3,
  Time00 = 4:6,
  X7236Nr1 = 7:9,
  Y844Nr1856 = 10:12,
  X9834Nr21 = 13:15,
  S844Nr567 = 16:18
)

# 重命名目标列
df <- df %>%
  rename_at(
    vars(matches("Nr\\d+")),  # 选中所有包含"Nr+数字"的列
    ~ sub(
      "Nr(\\d+)", 
      function(match) sprintf("Nr%04d", as.numeric(match)), 
      .
    )
  )

更推荐的rename_with(dplyr 1.0.0+)

library(dplyr)

df <- df %>%
  rename_with(
    ~ sub("Nr(\\d+)", function(m) sprintf("Nr%04d", as.numeric(m)), .),
    matches("Nr\\d+")
  )

方法二:Base R 原生实现(无需dplyr)

如果不想加载dplyr,直接用base R的sub函数修改列名:

colnames(df) <- sub(
  "Nr(\\d+)", 
  function(x) sprintf("Nr%04d", as.numeric(substr(x, 3, nchar(x)))), 
  colnames(df)
)

关键细节说明

  1. 列选择修正:你之前用的starts_with("[A-B][0-9]")无效,因为starts_with仅支持字面量前缀匹配,不解析正则。改用matches("Nr\\d+")可以精准选中所有包含Nr后跟数字的列。
  2. 正则与格式化:"Nr(\\d+)"捕获Nr后的数字,通过sprintf("%04d", ...)将数字格式化为4位,自动补前导零;如果数字本身是4位(比如1856),则保持不变。

内容的提问来源于stack exchange,提问作者eraysahin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:26:00