2016-04-19 39 views
1

我有一個包含美國參議員姓名的數據框,並且我需要提取姓氏的名稱,以便我可以將它們與另一個包含參議員其他信息的數據框進行模糊匹配,(和一個只包含姓氏的列)。從R中的名稱矢量中提取姓氏

問題是,名稱有時包含中間名或中間名,並在最後有參議員派對。我如何編寫一個gsub命令來提取參議員的姓氏?道歉,我是新來的正則表達式,真的很糟糕。

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

這裏的竅門是把倒數第二個元素在每分裂:

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)") 

回答

2

您可以在結果列表上使用strsplit()lapply()一起:

這裏的數據片段字符串,這是最後一個名字。

+0

於是就點見效快等優點!謝謝!我正在考慮第二個元素方面,但我無法弄清楚語法。再次感謝! – StanO

+2

你也可以使用''\\ s +「'作爲分割,以解釋當有人在那裏添加額外的空格字符時的情況。 – thelatemail

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

一個選項與stringi

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