R - 如何改进 simpleCap 以处理更复杂的名称?

R - How to improve simpleCap to handle more complex names?

提问人:Hack-R 提问时间:1/5/2015 最后编辑:Hack-R 更新时间:1/6/2015 访问量:161

问:

我使用一个通用函数来正确格式化数据库中的名称,以便进行报告:simpleCap

simpleCap <- function(x) {
  s <- strsplit(x, " ")[[1]]
  paste(toupper(substring(s, 1,1)), substring(s, 2),
        sep="", collapse=" ")
}

然后,在另一篇 Stackoverflow 帖子之后,我附加到本文的开头,以处理以全部大写形式输入的名称:tolower()

simpleCap <- function(x) {
  x <- tolower(x)
  s <- strsplit(x, " ")[[1]]
  paste(toupper(substring(s, 1,1)), substring(s, 2),
        sep="", collapse=" ")
}

这适用于“Greg Smith”或“Bob Jones”等名字,但我的大数据包含许多更复杂的名字。我可以使用一些帮助来解决以下情况:

  • 名称“bin”、“ibn”、“de”和“del”不应大写,例如“Sakib bin Salam”
  • 大写应适用于连字符名称中的两个名称,例如“Peng-Jones”
  • 只有包含单引号的名称中的第一个字母应大写,例如“Ta'if”,除非第一个字母是“O”,并且单引号位于第二个位置,如“O'Neil”
  • 以“al-”或“as-”开头的姓氏只能在连字符后大写
  • 姓氏以“De”开头,但“De”和其余姓氏之间没有空格,应像“DeGuest”一样大写
  • 带有“Mac”(即“MacDonald”)的名称应将第 1 个和第 4 个字母大写
  • 也许您可能知道的其他一些我没有想到的规则

示例输入

> "ADEDAYO  DAIBO"
> "EQEREM   ZEKA"
> "Mangaliso    Ndlovu"
> "Akamanwam    Itang"
> "Mohammed Al-Zahrani"
> "David    Fernando"
> "Adham    Obeidat"
> "TA'IF    Faithfull"
> "Bahaa    ALHAMMOUD"
> "Fatima   AlAli"
> "Tiffany  Scatliffe"
> "Imad Hameedullah"
> "HEIN ELLIS"
> "Victoria Francis-Anyanwu"
> "Michael  DeCesare"
> "chris    oboh"
> "La-Keisha    Wilmott"
> "sahar    al"
> "Yuri DEGUEST"
> "jim macdonald"
> "molly oneil"

示例输出

> "Adedayo  Daibo"
> "Eqerem   Zeka"
> "Mangaliso    Ndlovu"
> "Akamanwam    Itang"
> "Mohammed al-Zahrani"
> "David    Fernando"
> "Adham    Obeidat"
> "Ta'if    Faithfull"
> "Bahaa    al-Hammoud"
> "Fatima   al-Ali"
> "Tiffany  Scatliffe"
> "Imad Hameedullah"
> "Hein Ellis"
> "Victoria Francis-Anyanwu"
> "Michael  DeCesare"
> "Chris    Oboh"
> "La-Keisha    Wilmott"
> "Sahar    Al"
> "Yuri DeGuest"
> "Jim MacDonald"
> "Molly O'Neil"
正则表达式 R 模式匹配 大写

评论

2赞 MrFlick 1/5/2015
为了改进您的问题,您应该提供示例输入和所需的输出,这些输出可以用作所有规则的测试用例。然后,我们可以假设任何通过测试用例的代码都是“正确的”,否则就不可能考虑所有可能的国际大写规则。
4赞 MrFlick 1/6/2015
您将“BahaaAlDean ALHAMMOUD”更改为“Bahaa-al-Dean al-Hammoud”,但未指定任何添加连字符的规则。如果你不为此提供规则,就很难对某些东西进行编程。
0赞 Hack-R 1/6/2015
@MrFlick真的。我真的不知道规则应该是什么。我只是要改变这个例子(尽管这是我的数据中的真实案例),因为如果我们能修复其他东西,那么我可以手动更改这样的案例,或者至少我们仍然会取得重大进展。我想作为一个人,我知道它应该被连字符,因为它“看起来是中东的”并包含“al”,但我不知道如何将其翻译成 R,而不是使用 和/或.tmrandomForest
0赞 Sven Hohenstein 1/6/2015
您的数据是如何构建的?包含 2 列的数据框?
1赞 John Paul 1/6/2015
我想你也可能会得到像麦克唐纳和奥尼尔这样的名字,这可能会使事情进一步复杂化。

答: 暂无答案