从R中的名称向量中提取姓氏

时间:2016-04-19 03:33:59

标签: regex r gsub

我有一个包含美国参议员姓名的数据框,我需要只提取姓氏,这样我就可以将它们与另一个有参议员信息的数据框进行模糊匹配(以及一个只包含姓氏的列。)< / p>

问题在于名称有时包含中间的初始名称或中间名称,并且最后有参议员的名字。如何编写gsub命令只是为了提取参议员的姓氏?道歉,我是正则表达式的新手并且非常糟糕。

这里的数据片段:

names <- c("John Kerry (D)", "John H Chafee (R)", "Chris Dodd (D)", "Joe Lieberman (D)", "Frank R Lautenberg (D)", "Daniel Patrick Moynihan (D)", "Alfonse M D'Amato (R)", "Arlen Specter (R)", "Jay Rockefeller (D)", "Carl Levin (D)")

3 个答案:

答案 0 :(得分:3)

您可以在结果列表中使用strsplit()lapply()

> unlist(lapply(strsplit(names, " "), function(x) { return(x[length(x)-1]) }))
 [1] "Kerry"       "Chafee"      "Dodd"        "Lieberman"   "Lautenberg"
 [6] "Moynihan"    "D'Amato"     "Specter"     "Rockefeller" "Levin"

这里的技巧是在每个分割字符串中取最后一个元素,这是姓氏。

答案 1 :(得分:0)

这将为您解析名称。

library(stringi)
library(rex)
library(dplyr)
library(tidyr)

name_split = rex(capture(any_graphs), 
                     " ",
                     maybe(capture(any_graphs), 
                           " "),
                     capture(any_graphs),
                     " ",
                     "(", capture(upper), ")")

data_frame(string = names) %>%
  extract(string, c("first", "middle", "last", "party"), name_split) %>%
  filter(first %>% is.na %>% `!`)

答案 2 :(得分:0)

stringi

的一个选项
library(stringi)
stri_extract(names, regex="\\w+(?=\\s+\\()")
#[1] "Kerry"       "Chafee"      "Dodd"        "Lieberman"   "Lautenberg" 
#[6] "Moynihan"    "Amato"       "Specter"     "Rockefeller" "Levin"