如何将readxl导入生成的带...数字后缀的重名列修改为字母后缀格式
readxl同名列后缀格式转换实现方案
你原有代码的错误有两处:
str_replace的替换参数不会解析正则匹配规则,你写的[:alpha:][:digit:][:digit:]会被直接当成普通文本输出,自然无法保留原有前缀。- 正则中的
.是通配符,要匹配字面量的三个点后缀,需要转义为\\.,避免误匹配其他任意字符。
以下是匹配你需求的最简实现代码:
library(stringr) string <- c("G01","G01...2","G02","G03","G04","G04...6","G05","G05...8") # 用捕获组保留前缀,替换三个点加数字的后缀为A result <- str_replace(string, "^([:alpha:][:digit:]{2})\\.{3}\\d+$", "\\1A") print(result) # 输出结果和预期一致: # [1] "G01" "G01A" "G02" "G03" "G04" "G04A" "G05" "G05A"
如果存在超过2个同名列的场景(比如G01...3需要转为G01B),可以使用如下扩展方案:
# 多同名列适配方案 string_multi <- c("G01","G01...2","G01...3","G02","G02...5") result_multi <- str_match(string_multi, "^([:alpha:][:digit:]{2})(\\.{3}(\\d+))?$") |> as.data.frame() |> # 把readxl追加的序号转换为字母索引 transform(suffix_idx = ifelse(is.na(V3), 0, as.integer(V4) - 1)) |> transform(col_name = ifelse(suffix_idx == 0, V1, paste0(V1, LETTERS[suffix_idx]))) |> `[[`("col_name") print(result_multi) # 输出:[1] "G01" "G01A" "G01B" "G02" "G02A"
内容的提问来源于stack exchange,提问作者outofthegreen
相关产品推荐
相关产品推荐

