2014-02-16 10 views
6

Ich habe einen Vektor, der einige Namen enthält. Ich möchte den Titel in jeder Zeile extrahieren, im Grunde alles zwischen dem "," (inklusive Leerzeichen) und "."Alles zwischen zwei Symbolen in einer Zeichenfolge extrahieren

> head(combi$Name) 
[1] "Braund, Mr. Owen Harris" 
[2] "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" 
[3] "Heikkinen, Miss. Laina" 
[4] "Futrelle, Mrs. Jacques Heath (Lily May Peel)" 
[5] "Allen, Mr. William Henry" 
[6] "Moran, Mr. James" 

Ich nehme an gsub nützlich sein könnte, aber ich habe Schwierigkeiten, die richtigen regulären Ausdrücke zu finden, um meine Bedürfnisse zu erfüllen.

+0

Versuch ', ([. ^] +) \ .' –

Antwort

10

1) sub Mit sub

> sub(".*, ([^.]*)\\..*", "\\1", Name) 
[1] "Mr" "Mrs" "Miss" "Mrs" "Mr" "Mr" 

1a) sub Variation Dieser Ansatz mit gsub funktioniert auch:

> sub(".*, |\\..*", "", Name) 
[1] "Mr" "Mrs" "Miss" "Mrs" "Mr" "Mr" 

2) strapplyc oder mit strapplyc im gusbfn Paket Es kann mit einem einfacheren regulären Ausdruck erfolgen:

> library(gsubfn) 
> 
> strapplyc(Name, ", ([^.]*)\\.", simplify = TRUE) 
[1] "Mr" "Mrs" "Miss" "Mrs" "Mr" "Mr" 

2a) strapplyc Variation Dies scheint alle den einfachste regulären Ausdruck von ihnen zu haben.

> library(gsubfn) 
> 
> sapply(strapplyc(Name, "\\w+"), "[", 2) 
[1] "Mr" "Mrs" "Miss" "Mrs" "Mr" "Mr" 

3) strsplit Ein dritte Weg ist mit strsplit

> sapply(strsplit(Name, ", |\\."), "[", 2) 
[1] "Mr" "Mrs" "Miss" "Mrs" "Mr" "Mr" 

Added zusätzlichen Lösungen. Geändert gsub zu sub (obwohl gsub auch funktioniert).

+0

Danke! Es funktioniert perfekt. Ich muss ein bisschen reguläre Ausdrücke studieren. – Gianluca

+0

Ich fand einen Fall, in dem die Ergebnisse falsch sind: "Rothschild, Frau Martin (Elizabeth L. Barrett)". Mit dem 'gsub' Befehl ist das Ergebnis:' "Mrs. Martin (Elizabeth L" '. Vielen Dank im Voraus – Gianluca

+1

ok. Habe 1 und 2 geändert um das zu handhaben. 1a und 3 haben das schon erledigt. –

2

Nicht zu bemerken, dass es an G. Grothendiecks Antwort etwas fehlt. Ich will nur eine Lösung hinzuzufügen sub und nicht gierige Wiederholung mit:

vec <- c("Moran, Mr. James", 
     "Rothschild, Mrs. Martin (Elizabeth L. Barrett)") 

sub(".*, (.+?)\\..*", "\\1", vec) 
# [1] "Mr" "Mrs" 

Eine weitere Alternative mit regexpr, regmatches und Lookbehind/Look-Ahead:

regmatches(vec, regexpr("(?<=,).+?(?=\\.)", vec, perl = TRUE)) 
# [1] "Mr" "Mrs" 
Verwandte Themen