使用R从全名中提取姓氏

Extract last name from a full name using R

我的2000个名字都是"first name middle name last name"和"first name last name"混在一起的。我的代码只适用于那些有中间名的人。请参阅玩具示例。

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

" SMITH" "" " CARLO" "-YOUNG"

LOVE JOYJACKY lEE 没有任何结果。

p.s 这不是重复的 post 因为前面的不使用 gsub

将最后 space 之前的所有内容替换为空字符串。没有使用包。

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

注:

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

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"

或者,提取最后一个 space(或最后一个

之后的所有内容
library(stringr)
str_extract(names, '[^ ]+$')
# [1] "SMITH"     "LEE"       "JOY"       "CARLO"     "LEE-YOUNG"

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

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