在R中的长字符向量中格式化字符串(名字和姓氏)

时间:2016-04-17 07:31:40

标签: r grep gsub names

我的角色载体中有很多人的名字:

MLB$Names[1:4] [1] "Derek Jeter" "Robinson Cano" "Nick Markakis" "David Ortiz"

我想将它们格式化为包含第一个初始值,包含句点,然后是空格和它们的姓氏。我希望它看起来像下面的

MLB$NamesFormatted[1:4] [1] "D. Jeter" "R. Cano" "N. Markakis" "D. Ortiz"

我假设最好的攻击方法是使用grepsub,但我无法解决这个问题。我仍然是使用R的新手,但我非常喜欢它的所有功能!

任何帮助将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:1)

我们可以使用sub将第一个字符捕获为一个组(^(.)),然后是一个或多个非空格(\\S+),然后是另一个捕获组,或者一个或多个字符((\\s+.*))到字符串末尾($)后面的更多空格成功,并由第一个反向引用(\\1)后跟.替换然后是第二次反向引用(\\2)。

sub("^(.)\\S+(\\s+.*)$", "\\1.\\2", MLB$Names)
#[1] "D. Jeter"    "R. Cano"     "N. Markakis" "D. Ortiz"  

或者可以使用匹配一个或多个小写字母([a-z]+)的紧凑代码完成,并将其替换为.

sub("[a-z]+", ".", MLB$Names)
#[1] "D. Jeter"    "R. Cano"     "N. Markakis" "D. Ortiz"  

以下是strsplit的另一个选项,我们将其分成一个或多个小写字母,后跟一个或多个空格([a-z]+\\s+),并list循环vapply }和paste字符串在一起。

vapply(strsplit(MLB$Names, "[a-z]+\\s+"), paste, collapse=". ", character(1))
#[1] "D. Jeter"    "R. Cano"     "N. Markakis" "D. Ortiz"   

数据

MLB <- data.frame(Names = c("Derek Jeter", "Robinson Cano", 
              "Nick Markakis", "David Ortiz"), stringsAsFactors=FALSE)

答案 1 :(得分:1)

我们可以使用strsplitpaste

x <- c("Derek Jeter",   "Robinson Cano",     "Nick Markakis",     "David Ortiz")

sapply(strsplit(x, " "), function(x) paste0(substr(x[1], 1, 1), ". ", x[2]))

[1] "D. Jeter"    "R. Cano"     "N. Markakis" "D. Ortiz" 

我们首先拆分名字和姓氏,我们获得一份清单;我们sapply使用匿名函数:i)获取姓氏的首字母,ii)添加一个点和一个空格,iii)添加姓氏。