Изменение строк для преобразования 1 в 01

У меня есть объект, представляющий собой гигантскую матрицу с вектором, который содержит строку из трех букв, за которой следует число, например:

"aaa1" , "aaa2" , "aaa3" , "bbb1" ... 

Я хотел бы переписать этот столбец, чтобы значения 1-9 содержали 01-09, например:

"aaa01" , "aaa02" , "aaa03" , "bbb01" ... 

Есть ли способ сделать это эффективно?

Одно из решений, которое я придумал, состояло в том, чтобы отделить строку от числа, используя

a <- substr(object$column , 1 , 3)

а затем вставить строку с sprintf как

paste(a ,rep(sprintf("%02d",1:50))

Есть ли более эффективный способ решить эту проблему?

Изменить: числа в моем образце могут превышать 10


r
person Adrian    schedule 23.01.2020    source источник


Ответы (3)


Вы можете использовать sub, чтобы добавить 0 после третьего символа, например:

data <- c("aaa1" , "aaa2" , "aaa3" , "bbb1")
sub('^(.{3})(.*)$', '\\10\\2', data)

Результат:

[1] "aaa01" "aaa02" "aaa03" "bbb01"

ИЗМЕНИТЬ:

Если вы хотите добавить 0 после третьего символа, но только для имен с 1 цифрой после имени, измените * на ?, чтобы указать, что вы принимаете выражение, когда вхождение равно 1:

v <- c("aaa1" , "aaa2" , "aaa3" , "bbb13", "aaa43")
sub('^(.{3})(.?)$', '\\10\\2', v)

Результат:

[1] "aaa01" "aaa02" "aaa03" "bbb13" "aaa43"

Как указал @manotheshark, вы можете быть более строгими с правилами сопоставления строковых шаблонов, указав, что 3-й символ должен быть символом слова с w{3}, а место для вставки 0 должно быть однозначным числом с \\d:

sub('^(\\w{3})(\\d)$', '\\10\\2', v)  
person David Jorquera    schedule 23.01.2020
comment
Спасибо за ваш ответ! Решение работает, но только в том случае, если числа, следующие за строкой, могут принимать значения от 1 до 9. Я проверил еще раз, и мой образец может иметь числа выше 9, т.е. возможно иметь aaa35 - person Adrian; 23.01.2020
comment
Чтобы результаты были ожидаемыми, лучше указать их явно, а не использовать подстановочные знаки: sub('^(\\w{3})(\\d)$', '\\10\\2', v) - person manotheshark; 23.01.2020
comment
Спасибо, я добавил ваше предложение к ответу - person David Jorquera; 23.01.2020

Один из способов с суб

Orig  = c("aaa1" , "aaa2" , "aaa3" , "bbb1")
sub("([a-z])(\\d)\\b", "\\10\\2", Orig)

[1] "ааа01" "ааа02" "ааа03" "bbb01"

person G5W    schedule 23.01.2020

Базовое решение R

s <- c("aaa1" , "aaa2" , "aaa3" , "bbb1")
gsub("([[:alpha:]]+)","\\10",s)
person ThomasIsCoding    schedule 23.01.2020