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