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.