【问题标题】:Extract last name from a full name using R [duplicate]使用R从全名中提取姓氏[重复]
【发布时间】:2017-11-30 15:02:43
【问题描述】:

我拥有的 2000 个名字与“名字中间名姓氏”和“名字姓氏”混合在一起。我的代码只适用于那些有中间名的人。请参阅玩具示例。

names <- c("SARAH AMY SMITH", "JACKY LEE", "LOVE JOY", "MONTY JOHN CARLO", "EVA LEE-YOUNG")
last.name <- gsub("[A-Z]+ [A-Z]*","\\", people.from.sg[,7])

last.name

“史密斯”“”“卡罗”“-年轻”

LOVE JOYJACKY lEE 没有任何结果。

p.s 这不是重复的帖子,因为之前的帖子不使用 gsub

【问题讨论】:

  • 如果您确定名字/中间名/姓氏之间总会有空格,请改用strsplit
  • 我对strsplit不太熟悉。你能帮忙吗?
  • 文档有说明吗?

标签: r gsub


【解决方案1】:

用空字符串替换直到最后一个空格的所有内容。没有使用任何包。

sub(".* ", "", names)
## [1] "SMITH"     "LEE"       "JOY"       "CARLO"     "LEE-YOUNG"

注意:

关于下面对两个单词姓氏的评论,这似乎不是问题的一部分,但如果是,那么假设第一个单词是 DEL 或 VAN。然后用冒号替换它们后面的空格,比如说,然后执行上面的sub,然后将冒号恢复为空格。

names2 <- c("SARAH AMY SMITH", "JACKY LEE", "LOVE JOY", "MONTY JOHN CARLO", 
"EVA LEE-YOUNG", "ARTHUR DEL GATO", "MARY VAN ALLEN") # test data

sub(":", " ", sub(".* ", "", sub(" (DEL|VAN) ", " \\1:", names2)))
## [1] "SMITH"     "LEE"       "JOY"       "CARLO"     "LEE-YOUNG" "DEL GATO" 
## [7] "VAN ALLEN"

【讨论】:

  • 最佳答案如
  • 可能会导致组合西班牙语名称出现问题,例如“Miguel DEL GATO”(只是添加警告)
【解决方案2】:

或者,提取最后一个空格(或最后一个

library(stringr)
str_extract(names, '[^ ]+$')
# [1] "SMITH"     "LEE"       "JOY"       "CARLO"     "LEE-YOUNG"

或者,正如 mikeck 建议的那样,将字符串拆分为空格并取最后一个单词:

sapply(strsplit(names, " "), tail, 1)
# [1] "SMITH"     "LEE"       "JOY"       "CARLO"     "LEE-YOUNG"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多