【问题标题】:Formatting unusual (First and last Name) character strings in R在R中格式化不寻常的(名字和姓氏)字符串
【发布时间】:2016-08-09 11:41:13
【问题描述】:

我的字符串如下所示:

MLB$Name[1:6]
[1] "Wil Myers"   "Cory Spangenberg*"   "Alexei Ramirez #"   "Yangervis Solarte# (15-day dl)"   "Melvin Upton Jr."   "Travis d'Arnaud"

如您所见,这些字符串包含括号()、星号* 和其他不常见的字符(#d'Arnaud)。我正在从棒球网站上抓取这些内容,但它们并没有以友好的可用方式出现。我想要捕获的只是名字和姓氏,名字被缩写(后面有一个句点),然后是姓氏。我不想要任何常用字符,或名称后面的 (15-day dl)Jr.

我希望我的字符串看起来像这样:

MLB$NameFormatted[1:6]
[1] "W. Myers"   "C. Spangenberg"   "A. Ramirez"   "Y. Solarte"   "M. Upton"               "T. d'Arnaud"

我问的上一个问题得到了一个答案,该答案能够成功地将我的字符串仅包含名字和姓氏,并将它们格式化为您在上面看到的这种形式,但是,额外的奇怪字符和诸如 * 之类的东西, #15-day dl 导致此解决方案出现问题(预期)。以下代码仅用于格式化名字和姓氏:

sub("^(.)\\S+(\\s+.*)$", "\\1.\\2", MLB$Names)

非常感谢您的帮助 - 我是 R 新手,我正在尝试用棒球统计数据做一些非常有趣的事情。感谢您的宝贵时间!

【问题讨论】:

  • 例如sapply(strsplit(gsub("[^[:alpha:][:blank:]']", "", x), " "), function(x) {paste0(substr(x[1], 1, 1), ". ", x[2]) })?

标签: r regex character string-formatting


【解决方案1】:

这样做:

MLB$NameFormatted = sub("([A-Za-z])[A-Za-z']* ([A-Za-z' -]+[A-Za-z]+).*",'\\1. \\2', MLB$Name)

...以及正确处理“Ryan Rowland-Smith”和“Valerio de los Santos”等麻烦制造者

样本输出:

[1] "W. Myers" "C. Spangenberg" "A. Ramirez " "Y. Solarte" "M. Upton Jr"
[6] "T. d'Arnaud" "R. Rowland-Smith" "V. de los Santos"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    相关资源
    最近更新 更多