Вы можете сделать это с sub
и обратными ссылками. Использование данных x <- c("Doe John Mr.", "Smith John Doe Mr.")
:
sub("^(\\w+)( .* )(\\w+\\.?)$", "\\3\\2\\1", x)
#### OUTPUT ####
[1] "Mr. John Doe" "Mr. John Doe Smith"
Это охватывает три группы: 1) первое слово в строке ^(\\w+)
, 2) все, что находится между первым словом и последним словом ( .* )
, и 3) последнее слово в строке с 0 или 1 точкой (\\w+\\.?)$
. Затем он меняет группы 1 и 3, оставляя 2 там, где он есть.