我的角色载体中有很多人的名字:
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"
我假设最好的攻击方法是使用grep
或sub
,但我无法解决这个问题。我仍然是使用R的新手,但我非常喜欢它的所有功能!
任何帮助将不胜感激!谢谢!
答案 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)
我们可以使用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)添加一个点和一个空格,iii)添加姓氏。