r语言 - 将"firstname lastname"更改为"lastname, firstname"



我有一个名称列表,需要将其从"Firstname Lastname"转换为"Lastname,Firstname"。

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

我用G.Grothendieck对";姓、名"->quot;名字姓氏";在序列化的字符串中到达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

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

有一个名为person的深奥函数,它是为保存名称而设计的,一个为您进行解析的转换函数as.person,以及一个稍后使用它的format方法(创造性地使用大括号参数(。它甚至适用于复杂的姓氏(如范尼斯特鲁伊(,但单一姓氏的结果并不令人满意。不过,它可以用一个快速结束的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" 

使用

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" 

最新更新