Вот некоторые альтернативы. Все решения работают, если pc
является скаляром или вектором. Пакетов не требуется. Из них (3) кажется особенно коротким и простым.
1) Match все (.*
) до последней цифры (\\d
), а затем заменить, что с первым захватом (т.е. матч на часть в пределах первого набора скобок), плюс и второй захват (т.е. совпадение с последней цифрой).
sub("(.*)(\\d)", "\\1+\\2", pc)
2) Альтернативы, которая еще короче, чтобы соответствовать цифрам, за которым следует нецифровым и заменить, что с плюсом с последующим матчем:
sub("(\\d\\D)", "+\\1", pc)
## [1] "bt4+3xx"
3) Это еще меньше (2). Это соответствует последним 3-х символов, заменяющие матч с плюсом с последующим матчем:
sub("(...)$", "+\\1", pc)
## [1] "bt4+3xx"
4) Это одно разбивает строку на отдельные символы, вставляет плюс в соответствующем положении с помощью append
и помещает символы Вернуться вместе.
sapply(Map(append, strsplit(pc, ""), after = nchar(pc) - 3, "+"), paste, collapse = "")
## [1] "bt4+3xx"
Если pc
были известны скалярная (как в случае в вопросе) она может быть упрощена:
paste(append(strsplit(pc, "")[[1]], "+", nchar(pc) - 3), collapse = "")
[1] "bt4+3xx"
Это не выпирал потребность OP в качестве + после цифры. Я бы сделал 'sub (" (. *) (\\ d \\ D {2}) "," \\ 1 + \\ 2 ", pc)' – Haboryme
Ugh. Я пропустил это. Спасибо за уловку. – lmo