2016-04-19 12 views
1

Ich habe ein Datenfeld, das US-Senator-Namen enthält, und ich muss nur die Nachnamen herausfiltern, damit ich sie mit einem anderen Datenrahmen abgleichen kann, der andere Informationen über die Senatoren enthält (und eine Spalte, die nur Nachnamen enthält.)Extrahieren von Nachnamen aus einem Vektor von Namen in R

Das Problem ist, dass die Namen manchmal einen mittleren Anfangs- oder zweiten Vornamen enthalten und die Partei des Senators am Ende haben. Wie kann ich einen gsub-Befehl schreiben, nur um den Nachnamen des Senators zu extrahieren? Entschuldigung, ich bin neu in Regex und wirklich schlecht darin.

Snippet der Daten hier:

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

Antwort

2

Sie strsplit() zusammen mit lapply() auf der resultierende Liste verwenden können:

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

Der Trick hier ist das zweite zum letzten Element in jedem gespaltet zu nehmen String, der der Nachname ist.

+0

So schnell und so auf den Punkt! Vielen Dank! Ich dachte über den Aspekt des zweiten Elements nach, aber ich konnte die Syntax nicht herausfinden. Danke noch einmal! – StanO

+2

Sie könnten '' \\ s + '' auch als Split verwenden, um dem Umstand Rechnung zu tragen, dass jemand ein zusätzliches Leerzeichen hinzugefügt hat. – thelatemail

0

Dies wird die Namen für Sie analysieren.

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

Eine Option mit stringi

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