使用R

时间:2017-11-30 15:02:44

标签: r gsub

我拥有的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

  

“SMITH”“”“CARLO”“-YOUNG”

LOVE JOYJACKY lEE没有任何结果。

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

2 个答案:

答案 0 :(得分:3)

用空字符串将所有内容替换为最后一个空格。没有包使用。

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"

答案 1 :(得分:2)

或者,在最后一个空格(或最后一个

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

或者,正如迈克克建议的那样,将字符串拆分为空格并使用最后一个字:

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