如何用正则表达式一次性替换数据框列名中第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
相关产品推荐
相关产品推荐

