Модификация строк для преобразования 1 в 01 - PullRequest
1 голос
/ 23 января 2020

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

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

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

Редактировать: числа в моем образце могут go более 10

Ответы [ 3 ]

5 голосов
/ 23 января 2020

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

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

Результат:

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

РЕДАКТИРОВАТЬ:

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

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

Результат:

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

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

sub('^(\\w{3})(\\d)$', '\\10\\2', v)  
1 голос
/ 23 января 2020

Один способ - с суб

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

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

0 голосов
/ 23 января 2020

Базовый раствор R

s <- c("aaa1" , "aaa2" , "aaa3" , "bbb1")
gsub("([[:alpha:]]+)","\\10",s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...