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

如何用正则表达式一次性替换数据框列名中第1、2个下划线为指定字符?

用正则表达式一次性替换列名中的指定下划线

针对你的需求,无需两次调用str_replace,通过正则捕获组就能实现一次性将第一个下划线替换为r、第二个下划线替换为c:

解决方案代码

library(tidyverse)

# 示例数据
dat <- data.frame(Q12_1_1 = NA)

# 一次性完成重命名
dat <- dat %>%
  rename_with(
    .cols = starts_with('Q12'),
    .fn = ~str_replace(., "^(.*?)_(.*?)_(.*)$", "\\1r\\2c\\3")
  )

# 验证结果
colnames(dat)
# [1] "Q12r1c1"

正则表达式说明

  • ^(.*?)_(.*?)_(.*)$:
    • ^ 匹配字符串起始位置
    • (.*?) 非贪婪捕获第一个下划线前的所有字符(即示例中的Q12)
    • 第一个_ 定位要替换为r的下划线
    • (.*?) 非贪婪捕获两个下划线之间的字符(即示例中的1)
    • 第二个_ 定位要替换为c的下划线
    • (.*)$ 捕获第二个下划线后的所有字符(即示例中的1)
  • \\1r\\2c\\3:将三个捕获组用r和c拼接,替换原字符串

适配更多下划线的通用场景

如果列名包含超过两个下划线,但只需替换前两个,可使用带计数的自定义替换函数配合str_replace_all:

dat %>%
  rename_with(
    .cols = starts_with('Q12'),
    .fn = ~{
      count <- 0
      str_replace_all(., '_', function(x) {
        count <<- count + 1
        if (count == 1) "r" else if (count == 2) "c" else x
      })
    }
  )

该方法会保留第三个及以后的下划线,仅替换前两个目标下划线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:50:38