2013-07-28 14 views
5

Leapfrogging von einer vorherigen Frage, habe ich Probleme mit der richtigen Reg-Ausdruck-Syntax, um ein bestimmtes Wort zu isolieren.Extrahieren eines bestimmten Wortes mit Gsub und Regex

Bei einem Datenrahmen:

DL<-c("Dark_ark","Light-Lis","dark7","DK_dark","The_light","Lights","Lig_dark","D_Light") 
Col1<-c(1,12,3,6,4,8,2,8) 
DF<-data.frame(Col1) 
row.names(DF)<-DL 

Ich suche Extrakt alle „Dark“ und „Light“ (ohne Berücksichtigung vs kleingeschrieben obere) aus den Zeilennamen und eine zweite Spalte nur das enthalten, machen string "Dark" oder "Light"

Col2<-c("Dark","Light","dark","dark","light","Light","dark","Light") 
DF$Col2<-Col2 

      Col1 Col2 
Dark_ark  1 Dark 
Light-Lis 12 Light 
dark7  3 dark 
DK_dark  6 dark 
The_light 4 light 
Lights  8 Light 
Lig_dark  2 dark 
D_Light  8 Light 

Ive verändert die ursprünglichen Daten ein wenig zum Detail meine aktuellen Ausgabe, sondern eine ausgezeichnete Antwort von Tyler Rinker arbeiten, habe ich dieses:

DF$Col2<-gsub("[^dark|light]", "", row.names(DF), ignore.case = TRUE) 

Aber die gsub wird auf einige der gemeinsamen Buchstaben gestolpert. Suchen Sie die Message-Boards für mit regex ein exaktes Wort zu isolieren, es sieht aus wie die Antwort mit doppeltem Schrägstrich zu verwenden, sollte entweder

\\<light\\> 

oder

\\blight\\b 

Warum also die Linie

DF$Col2<-gsub("[^\\<dark\\>|\\<light\\>]", "", row.names(DF), ignore.case = TRUE) 

Nicht die gewünschte Spalte oben ziehen? Stattdessen bekomme ich

  Col1 Col2 
Dark_ark  1 Darkark 
Light-Lis 12 LightLi 
dark7  3 dark 
DK_dark  6 DKdark 
The_light 4 Thlight 
Lights  8 Light 
Lig_dark  2 Ligdark 
D_Light  8 DLight 
+1

Niemand eine Regex Frage beantworten wenn es nicht [ssce] ist (http://sscce.org) – aaronman

+1

Zuerst wird '\\ b' zum Definieren von Wortgrenzen verwendet. Sie müssen also sagen, was genau die Zeichenfolge dazwischen ist. Du kannst es nicht negieren. Zweitens benutzt es Leerzeichen und Interpunktionen, um Grenzen zu finden ... und '_' gehört nicht dazu. – Arun

Antwort

9

Wie wäre es damit?

unlist(regmatches(rownames(DF), gregexpr("dark|light", rownames(DF), ignore.case=TRUE))) 
# [1] "Dark" "Light" "dark" "dark" "light" "Light" "dark" "Light" 

oder

gsub(".*(dark|light).*$", "\\1", row.names(DF), ignore.case = TRUE) 
# [1] "Dark" "Light" "dark" "dark" "light" "Light" "dark" "Light" 
+0

Obwohl es in der allgemeinen Praxis etwas riskant ist, und weil 'as.character' so arbeitet, wie es funktioniert, könntest du das erste machen: 'tolower (regmatches (rownames (DF), gregexpr (" dark | light ", rownames (DF), ignore.case = TRUE))) ' – thelatemail

+0

.... und wohl der zweite würde konsistentere Ergebnisse liefern mit:' gsub (". * (dunkel | hell). * $", "\\ 1", tolower (row.names (DF))) ' – thelatemail

+0

@thelatemail, die von OP angezeigte Ausgabe hat zum Beispiel sowohl" Dark "als auch" Dark ", je nachdem, was in rownames vorhanden ist. Daher die Abwesenheit von "tolower" in der Antwort. – Arun

5

Eine Option ist stringr Paket zu verwenden:

library(stringr) 
str_extract(tolower(rownames(DF)),'dark|light') 
[1] "dark" "light" "dark" "dark" "light" "light" "dark" "light" 

Oder besser @Arun Vorschlag mit:

str_extract(rownames(DF), ignore.case('dark|light')) 
+2

Agstudy, scheint, können Sie tun: 'str_extract (rownames (DF), ignorieren.Fall ('dunkel | Licht')) ' – Arun

+0

@Arun ausgezeichnet. genau das, was ich versucht habe zu tun. – agstudy

Verwandte Themen