将"firstname lastname"更改为"lastname,firstname"

phi*_*l_t 3 regex string r

我有一个名称列表,我需要从"名字姓氏"转换为"姓氏,名字".

Barack Obama
Donald J. Trump
J. Edgar Hoover
Beyonce Knowles-Carter
Sting
Run Code Online (Sandbox Code Playgroud)

我使用了G. Grothendieck对"姓氏,名字" - >"名字姓氏"的回答,序列化的字符串gsub("([^ ]*) ([^ ]*)", "\\2, \\1", str)了我 -

Obama, Barack
J., DonaldTrump, 
Edgar, J.Hoover, 
Knowles-Carter, Beyonce
Sting
Run Code Online (Sandbox Code Playgroud)

我想得到什么 -

Obama, Barack
Trump, Donald J. 
Hoover, J. Edgar
Knowles-Carter, Beyonce
Sting
Run Code Online (Sandbox Code Playgroud)

我想要一个正则表达式的答案.

Jam*_*mes 6

有一个深奥的函数叫做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" 
Run Code Online (Sandbox Code Playgroud)

  • 等等...什么?R有内置的“人”功能吗?Dang,*似乎*颇具深奥...但目前非常合适。 (2认同)

Mar*_*zer 5

使用

gsub("(.*[^van])\\s(.*)", "\\2, \\1", people)
Run Code Online (Sandbox Code Playgroud)

正则表达式:

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

数据:

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

结果:

    [1] "Obama, Barack"           "Trump, Donald J."        "Hoover, J. Edgar"       
[4] "Knowles-Carter, Beyonce" "Sting"                   "van Nistelrooy, Ruud"   
[7] "Jinping, Xi"             "Zimvanmer, Hans" 
Run Code Online (Sandbox Code Playgroud)