Изменение "имя фамилия" на "фамилия, имя" - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть список имен, которые мне нужно преобразовать из «Имя Фамилия» в «Фамилия, Имя».

Barack Obama
Donald J. Trump
J. Edgar Hoover
Beyonce Knowles-Carter
Sting

Я использовал ответ Г. Гротендика на «фамилия, имя» -> «имя, фамилия» в сериализованных строках , чтобы добраться до gsub("([^ ]*) ([^ ]*)", "\\2, \\1", str), что дает мне -

Obama, Barack
J., DonaldTrump, 
Edgar, J.Hoover, 
Knowles-Carter, Beyonce
Sting

Что бы я хотел получить -

Obama, Barack
Trump, Donald J. 
Hoover, J. Edgar
Knowles-Carter, Beyonce
Sting

Я хотел бы получить ответ регулярного выражения.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Существует эзотерическая функция с именем person, предназначенная для хранения имен, функция преобразования as.person, которая выполняет этот анализ для вас, и метод format, чтобы впоследствии использовать его (с творческим использованием аргумента фигурных скобок).).Он даже работает со сложными фамилиями (например, van Nistelrooy), но результат одного имени неудовлетворителен.Это может быть исправлено с быстрым окончанием sub, хотя.

x <- c("Barack Obama","Donald J. Trump","J. Edgar Hoover","Beyonce Knowles-Carter","Sting", "Ruud van Nistelrooy", "John von Neumann")
y <- as.person(x)

format(y, include=c("family","given"), braces=list(family=c("",",")))
[1] "Obama, Barack"           "Trump, Donald J."       
[3] "Hoover, J. Edgar"        "Knowles-Carter, Beyonce"
[5] "Sting,"                  "van Nistelrooy, Ruud"   
[7] "von Neumann, John"

## fix for single names - curse you Sting!

sub(",$", "", format(y, include=c("family","given"), braces=list(family=c("",","))))
[1] "Obama, Barack"           "Trump, Donald J."       
[3] "Hoover, J. Edgar"        "Knowles-Carter, Beyonce"
[5] "Sting"                   "van Nistelrooy, Ruud"   
[7] "von Neumann, John" 
0 голосов
/ 07 декабря 2018

Использование

gsub("(.*[^van])\\s(.*)", "\\2, \\1", people)

Регулярное выражение:

(.*[^van])                                         \\s                      (.*)
Any ammount of characters exluding "van"...  the last white space...  The last name containing any character.

Данные:

people <- c("Barack Obama",
            "Donald J. Trump",
            "J. Edgar Hoover",
            "Beyonce Knowles-Carter",
            "Sting",
            "Ruud van Nistelrooy",
            "Xi Jinping",
            "Hans Zimvanmer")

Результат:

    [1] "Obama, Barack"           "Trump, Donald J."        "Hoover, J. Edgar"       
[4] "Knowles-Carter, Beyonce" "Sting"                   "van Nistelrooy, Ruud"   
[7] "Jinping, Xi"             "Zimvanmer, Hans" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...