2013-07-28 13 views
5

Przeskakując z poprzedniego pytania, mam problem z prawidłową składnią wyrażeń reg, aby wyizolować określone słowo.Wyodrębnianie określonego słowa za pomocą gsub i regex

względu ramka danych:

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 

Szuka ekstrakt wszystkich „ciemne” i „światło” (pomijając górnej vs małymi literami) od nazw wierszy i złożyć drugą kolumnę zawierającą tylko ciąg „ciemny” lub „lekki”

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 zmienił oryginalne dane trochę o szczegóły mój aktualny problem, ale działa z doskonałą odpowiedź od Tyler Rinker, użyłem tego:

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

Ale gsub zostaje potknięty na niektórych wspólnych literach. Przeszukując fora izolowania dokładne słowa z regex, wygląda na to, że odpowiedź powinna być użycie podwójny ukośnik albo z

\\<light\\> 

lub

\\blight\\b 

Więc dlaczego linia

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

Nie pociągnij żądanej kolumny powyżej? Zamiast tego otrzymuję

  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

Nikt nie odpowie na pytanie regex jeśli to nie jest [ssce] (http://sscce.org) – aaronman

+1

Po pierwsze, '\\ b' służy do definiowania granic słów. Więc będziesz musiał powiedzieć, jaki jest dokładny ciąg pomiędzy. Nie możesz tego negować afaiu. Po drugie, używa spacji i znaków interpunkcyjnych do wyszukiwania granic ... a "_" nie jest jednym z nich. – Arun

Odpowiedz

9

Co z tym?

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

lub

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

Chociaż jest to nieco ryzykowne w ogólnej praktyce i ze względu na to, że 'as.character' działa tak, jak to robi, możesz zrobić pierwszy:' tolower (regmatyki (rownames (DF), gregexpr ("dark | light", rownames (DF)), ignore.case = TRUE))) ' – thelatemail

+0

.... i prawdopodobnie drugi dałby bardziej spójne wyniki z:' gsub (". * (ciemny | jasny). * $", "\\ 1", tolower (row.names (DF))) ' – thelatemail

+0

@mail, wyjście pokazane przez OP ma, na przykład, zarówno" Dark "i" dark "w zależności od tego, który jest obecny w rownames. Stąd brak "tolower" w odpowiedzi. – Arun

5

Jedną z opcji jest użycie stringr pakiet:

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

lub lepszy użyciu @Arun sugestia:

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

agstudy, wydaje się, że możesz zrobić: 'str_extract (rownames (DF), zignoruj.case ('dark | light')) ' – Arun

+0

@Arun doskonałe. dokładnie to, co próbowałem zrobić. – agstudy

Powiązane problemy