2016-07-12 7 views
-3

Worte habe ich ein Zeichen (Text) Spalte:Regex in R - Unterkette basiert auf zwei Start Extrahieren/Stopp

tweets <- c(
    "Drinking a Bud Light by @Budweiser @ Joe's Crab Shack http://www.joes.com", 
    "Drinking a Sam Adams Winter Ale by @SamAdams @ Growler Stop http://www.growlerstop.com", 
    "Drinking a Coco Loco by @NoDaBrewing @ The Corner Pub http://www.cornerpub.com" 
) 

Wie Sie die Tweets haben eine Standardstruktur sehen können, übernehmen:

"Drinking a [name of beer] by @[name of brewery] @ [name of bar, notice whitespace] http://" 

möchte ich reguläre Ausdrücke verwenden (und substr()?) drei neue Spalten zu erstellen:

  1. Namen des Bieres
  2. Name der Brauerei
  3. Name der Bar (beachten Sie, dass es Leerraum haben könnte, muss so um gehen „http:“)

Einen Schritt weiter - wie steuere ich für einige Tweets, die nicht die gleiche Struktur haben?

Antwort

3

Es ist hässlich:

setNames(nm=c('beer','brewery','bar'),as.data.frame(do.call(rbind, 
    regmatches(tweets,regexec('^Drinking an? (.*) by @(.*) @ (.*) http://.*$',tweets)) 
)[,-1L])); 
##     beer  brewery    bar 
## 1   Bud Light Budweiser Joe's Crab Shack 
## 2 Sam Adams Winter Ale SamAdams  Growler Stop 
## 3   Coco Loco NoDaBrewing The Corner Pub 

Siehe regexec() und regmatches().

1
do.call(rbind,strsplit(gsub('.*\\ba\\b(.*) by @(.*) @(.*) http.*','\\1|\\2|\\3',tweets),'\\|')) 

#  [,1]     [,2]   [,3]    
#[1,] " Bud Light"   "Budweiser" " Joe's Crab Shack" 
#[2,] " Sam Adams Winter Ale" "SamAdams" " Growler Stop"  
#[3,] " Coco Loco"   "NoDaBrewing" " The Corner Pub"