Как я могу поменять местами первый и последний элемент строки символов? - PullRequest
1 голос
/ 30 июня 2019

У меня есть фрейм данных с символьным столбцом с именами в следующем формате: "Lastname Middlename Title". Мне нужно поменять местами "Lastname" и "Title", и это зависит от количества отчеств для каждой строки.

Примеры ввода:

Doe John Mr. 
Smith John Doe Mr.

Желаемый вывод:

Mr. John Doe 
Mr. John Doe Smith

Ответы [ 3 ]

2 голосов
/ 30 июня 2019

Вы можете сделать это с 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 там, где он есть.

1 голос
/ 30 июня 2019

Мы можем использовать strplit.

str1 <- "Doe John Mr." 
str2 <- "Smith John Doe Mr."

Reduce(paste, el(strsplit(str1, " "))[3:1])
# [1] "Mr. John Doe"

Reduce(paste, el(strsplit(str2, " "))[c(4, 2, 3, 1)])
# [1] "Mr. John Doe Smith"
0 голосов
/ 30 июня 2019

Я использовал tokenizer, чтобы разделить входную строку, а затем перейти в обратном порядке. Я заметил, что ваш пример в обратном порядке, поэтому я работаю над этим. Если у вас есть другие примеры, где они не в обратном порядке, все, что вам нужно сделать, это расположить их в нужном вам порядке.

library(tokenizers)
string <- "Doe John Mr. Smith Doe John Mr."
y <- tokenize_words(string, strip_punct = TRUE, simplify = TRUE)  
rev(y)
...