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

Extracting last-names from a vector of names in R

我有一个包含 U.S 的数据框。参议员姓名,我只需要提取姓氏,这样我就可以将它们与另一个包含参议员其他信息的数据框(以及仅包含姓氏的列)进行模糊匹配。

问题是这些名字有时包含中间名的首字母或中间名,并在末尾有参议员的政党。我如何编写一个 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)")

您可以在结果列表中使用 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"

这里的技巧是取每个拆分字符串中的倒数第二个元素,即姓氏。

这将为您解析出名称。

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 %>% `!`)

一个选项 stringi

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