Zamień określone znaki w ciągach znaków


262

Chciałbym usunąć określone znaki z ciągów w wektorze, podobnie jak Znajdź i zamień w programie Excel.

Oto dane, od których zaczynam:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

Zaczynam od pierwszej kolumny; Chcę utworzyć drugą kolumnę, usuwając e:

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

Odpowiedzi:


399

Z wyrażeniem regularnym i funkcją gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

Co gsubrobi tutaj ma zastąpić każde wystąpienie "e"z pustym ciągiem "".


Zobacz ?regexplub gsubwięcej pomocy.


15
fixed = TRUEprzyspieszy to.
Rich Scriven,

4
@RichScriven mógłbyś krótko wyjaśnić, dlaczego?
spojrzał

6
fixed=TRUEuniemożliwia R używanie wyrażeń regularnych, które pozwalają na bardziej elastyczne dopasowanie wzorca, ale wymagają czasu na obliczenie. Jeśli wszystko, co jest potrzebne, to usunięcie pojedynczego stałego ciągu „e”, nie są one konieczne.
mm689 31.10.16

Czy sub("e", "", group)miałby ten sam wynik?
Matheus Santana

po prostu zastąpi pierwsze eznalezione w każdym elemencie
sindri_baldur

47

Wyrażenia regularne to twoi przyjaciele:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

Teraz użyj gsub()najprostszego możliwego wzoru zastępczego: pusty ciąg:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 

3
Także ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
dickoa,

26
Cóż, mógłbym chichotać, że „ci, którzy nie rozumieją podstawowych funkcji, są skazani na ich zastąpienie”. Dokładnie to, co zyskuje tutaj stringr, oprócz zwiększenia liczby znaków podkreślenia w pliku źródłowym?
Dirk Eddelbuettel,

8
stringr to zestaw prostych opakowań, które sprawiają, że funkcje ciągu R są bardziej spójne, prostsze i łatwiejsze w użyciu ” od autora pakietu. Więc jeśli to, co mówisz, jest prawdą (wiele znaków podkreślenia, by zawijać funkcje podstawowe ...), nie ma powodu, aby istniał ten pakiet (zastrzeżenie: używam głównie podstawowych wyrażeń regularnych, ale wiem, że mogą być trudne dla nowych użytkowników ... )
dickoa,

17
@dickoa: str_replacezawija sub, więc zastąpi tylko pierwsze wystąpienie wzorca. Musisz użyć, str_replace_alljeśli chcesz mieć takie samo zachowanie jak gsub.
Joshua Ulrich,

24

Podsumowując 2 sposoby zamiany ciągów:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) Użyj gsub

group$group.no.e <- gsub("e", "", group$group)

2) Użyj stringrpaczki

group$group.no.e <- str_replace_all(group$group, "e", "")

Oba wytworzą pożądany wynik:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

3
W tym czasie musiałeś przeczytać całą stronę, w tym komentarze, aby nauczyć się składni stringr, mojej preferowanej metody, ponieważ była ona głównie omawiana w komentarzach. To rozwiązanie szybko przedstawia obie opcje i dlatego to zaproponowałem. Miałem nadzieję, że pomogę innym użytkownikom w filtrowaniu, tak jak musiałem, kiedy byłem nowy w R. Walczyłem z gsub przed znalezieniem stringr, ponieważ nie było o nim wzmianki w bardzo pozytywnej odpowiedzi. Ponownie, celem nie jest zebranie pozytywnych opinii, ale próba pomocy nowym użytkownikom R.
Megatron

Jeśli znajdziesz informacje w innych odpowiedziach / komentarzach, które uważasz za przydatne i które chcesz przekonwertować na odpowiedź, możesz przynajmniej podać informacje o tym, skąd otrzymałeś informacje z / uczynić odpowiedź Comminuty Wiki zamiast po prostu zrobić to jako Twój własny.
David Arenburg,

Dzięki - będziemy pamiętać o tym następnym razem. Nigdy wcześniej nie tworzyłem wiki społeczności, więc nie wiedziałem, że jest to opcja.
Megatron

1
Opcja 2 działa świetnie po zastosowaniu do kolumny danych w ramce danych, bez określania wszystkich wartości w kolumnie. Oczywiście opcja 1 jest powtórzeniem, ale opcja 2 działa bardzo dobrze i zasługuje na głosowanie za dodatkową funkcjonalnością.
Phil_T

6

Nie musisz tworzyć ramki danych z wektora ciągów, jeśli chcesz zamienić w niej niektóre znaki. Wyrażenia regularne to dobry wybór, ponieważ zostały już wspomniane przez @Andrie i @Dirk Eddelbuettel.

Zwróć uwagę, jeśli chcesz zastąpić znaki specjalne, takie jak kropki, powinieneś zastosować pełną składnię wyrażeń regularnych, jak pokazano w przykładzie poniżej:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

to wytworzy

[1] "Czech Republic" "New Zealand"    "Great Britain" 

Możesz po prostu uciec od nich, ale musisz także uciec przed ucieczką, ponieważ jest w cudzysłowie:gsub("\\.", " ", ctr_names)
Kamil S Jaron

4

Użyj pakietu stringi :

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"

0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.