在 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"
我假设解决这个问题的最佳方法是使用 grep
或 sub
,但我一辈子都弄不明白。我仍然是使用 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+
),循环遍历 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)
我们可以使用strsplit
和paste
:
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) 添加姓氏。
我的字符向量中有很多人的名字:
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"
我假设解决这个问题的最佳方法是使用 grep
或 sub
,但我一辈子都弄不明白。我仍然是使用 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+
),循环遍历 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)
我们可以使用strsplit
和paste
:
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) 添加姓氏。