#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"