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

Formatting Character strings (First and Last Names) in a long character vector in R

我的字符向量中有很多人的名字:

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

我想将它们格式化为包含第一个首字母和句点,然后是 space 和他们的姓氏。我希望它看起来像下面这样

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

我假设解决这个问题的最佳方法是使用 grepsub,但我一辈子都弄不明白。我仍然是使用 R 的新手,但我喜欢它的所有功能!

如有任何帮助,我们将不胜感激!谢谢!

我们可以使用 sub 将第一个字符捕获为一组 (^(.)),然后是一个或多个非白色 spaces (\S+)由一个或多个白色 space 后接一个或多个字符 ((\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 的另一种选择,我们用一个或多个小写字母分隔,后跟一个或多个 spaces ([a-z]+\s+),循环遍历 listvapplypaste 字符串在一起。

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)

我们可以使用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) 添加一个点和一个 space,iii) 添加姓氏。