2016-04-19 11 views
1

私はアメリカの議員の名前を含むデータフレームを持っています。私は上院議員に関する他の情報を持つ別のデータフレームとあいまいにするために姓だけを抽出する必要があります。名前のベクトルから最後の名前を抽出するR

名前には中間の頭文字または中間の名前が含まれていて、最後に上院議員の党があることが問題です。上院議員の姓を抽出するためだけに、どのように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)") 

答えて

2

あなたは結果のリストにlapply()とともにstrsplit()を使用することができます。

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

ここにトリックは、各分割さに最後の要素に2つ目を取ることです文字列は姓である。

+0

ポイント上とそこそこ速いです!ありがとうございました!私は第2要素の側面について考えていましたが、構文を理解できませんでした。再度、感謝します! – 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" 
関連する問題