Переименовывать строки с одинаковыми именами

#r #string #data-cleaning #stringr

Вопрос:

Контекст

При импорте столбцов с одинаковыми именами из программного обеспечения для электронных таблиц readxl преобразует дублоны со следующим синтаксисом : «Col1″,»Col1» становится : «Col1″,»Col1…2». Я хотел бы вместо этого преобразовать его в «Col1″,»Col1A».

Вот воспроизводимый пример :

Пример

 # Original string : 
library(stringr)
string <- c("G01","G01...2","G02","G03","G04","G04...6","G05","G05...8")
# Desired result
result <- c("G01","G01A","G02","G03","G04","G04A","G05","G05A")
# this line successfully detects the wrongful entries : 


str_detect(string,pattern = "[:alpha:][:digit:][:digit:]...[:digit:]")
 # this line fails to address the issue correctly : 
 str_replace(string,"[:alpha:][:digit:][:digit:]...[:digit:]", "[:alpha:][:digit:][:digit:]A")
    #output : 
    [1] "G01"                          "[:alpha:][:digit:][:digit:]A" "G02"                         
    [4] "G03"                          "G04"                          "[:alpha:][:digit:][:digit:]A"
    [7] "G05"                          "[:alpha:][:digit:][:digit:]A"
 

Ответ №1:

Мы могли бы использовать str_remove для удаления подстроки , начинающейся с одного или нескольких . символов, за которыми следуют любые другие символы, а затем использовать make.unique для изменения дубликатов путем добавления .1 и т. .2 Д

 library(stringr)
make.unique(str_remove(string, "\. .*"))
 

Если нам нужно будет добавить LETTERS , проблема будет заключаться в том, что будет только 26 дубликатов, которые можно будет заполнить

Ответ №2:

Предполагая, что будет не более 26 дубликатов, вы могли бы сделать

 nm = sapply(strsplit(string, "\.{3}"), function(x) x[1])
paste0(nm, ave(nm, nm, FUN = function(x) c("", LETTERS)[seq_along(x)]))
# [1] "G01"  "G01A" "G02"  "G03"  "G04"  "G04A" "G05"  "G05A"