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
Łukasz
źródło

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.

Andrie
źródło
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> 
Dirk Eddelbuettel
źródło
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
Megatron
źródło
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" 
Alexander
źródło
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"
MERose
źródło
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" 
Anya Sti
źródło