Usunąć wszystkie znaki specjalne z ciągu w R?

118

Jak usunąć wszystkie znaki specjalne z ciągu w R i zastąpić je spacjami?

Niektóre znaki specjalne do usunięcia to: ~!@#$%^&*(){}_+:"<>?,./;'[]-=

Próbowałem regexz [:punct:]wzorem, ale usuwa tylko znaki interpunkcyjne.

Pytanie 2: A jak usunąć znaki z języków obcych, takie jak â í ü Â á ą ę ś ć:?

Odpowiedź: Użyj, [^[:alnum:]]aby usunąć ~!@#$%^&*(){}_+:"<>?,./;'[]-=i użyj, [^a-zA-Z0-9]aby usunąć także â í ü Â á ą ę ś ćw regexlub regexprfunkcje.

Qbik
źródło
4
Jaka jest definicja „znaku specjalnego”?
kohske
Moją własną definicją byłby każdy znak spoza Unicode ;-). Ale myślę, że wielu innych ludzi by się nie zgodziło.
Joey
Może spójrz na sublub gsubfunkcje.
Paul Hiemstra
5
regex [: punct:] zrobi połowę pracy lub może wszystko
Qbik

Odpowiedzi:

197

Aby zidentyfikować niechciane znaki, musisz użyć wyrażeń regularnych . Aby uzyskać najłatwiejszy do odczytania kod, potrzebujesz kodu str_replace_allz stringrpakietu, chociaż gsubz podstawowego R działa równie dobrze.

Dokładne wyrażenie regularne zależy od tego, co próbujesz zrobić. Możesz po prostu usunąć te określone znaki, które podałeś w pytaniu, ale znacznie łatwiej jest usunąć wszystkie znaki interpunkcyjne.

x <- "a1~!@#$%^&*(){}_+:\"<>?,./;'[]-=" #or whatever
str_replace_all(x, "[[:punct:]]", " ")

(Podstawowy odpowiednik R to gsub("[[:punct:]]", " ", x).)

Alternatywą jest zamiana wszystkich znaków niealfanumerycznych.

str_replace_all(x, "[^[:alnum:]]", " ")

Zwróć uwagę, że definicja tego, co stanowi literę, cyfrę lub znak interpunkcyjny, różni się nieznacznie w zależności od Twojego regionu, więc może być konieczne trochę poeksperymentowania, aby uzyskać dokładnie to, czego chcesz.

Richie Cotton
źródło
11
ładne odpowiedzi +1 Możesz zamienić znak na, " "w ""przeciwnym razie masz puste miejsce w ciągu.
Tyler Rinker
8
@TylerRinker: To prawda, chociaż QBik specjalnie poprosił o spacje.
Richie Cotton
8
Jak usunąć remowe tych szalonych znaków: â í ü Â á?
Qbik
1
Musisz poczytać o wyrażeniach regularnych. Zacznij od linku w mojej odpowiedzi, a następnie przeczytaj ?regexi ?regexpr.
Richie Cotton
1
Spróbuj zastąpić [^[:alnum:]]go [^a-zA-Z0-9]lub ewentualnie \\W.
Richie Cotton
28

Zamiast używać wyrażeń regularnych do usuwania tych „szalonych” znaków, po prostu przekonwertuj je na ASCII, co usunie akcenty, ale zachowa litery.

astr <- "Ábcdêãçoàúü"
iconv(astr, from = 'UTF-8', to = 'ASCII//TRANSLIT')

Co skutkuje w

[1] "Abcdeacoauu"
Felipe Alvarenga
źródło
Musiałem dodać iconv(astr, from="UFT-8", to="ASCII//TRANSLIT"), inaczej z francuskimi postaciami wygląda çto trochę zabawnie.
Duccio A,
8

Zamień znaki specjalne na apostrof,

Data  <- gsub("[^0-9A-Za-z///' ]","'" , Data ,ignore.case = TRUE)

Poniżej zakoduj go, aby usunąć dodatkowy apostrof '' '

Data <- gsub("''","" , Data ,ignore.case = TRUE)

Użyj gsub(..)funkcji do zastąpienia znaku specjalnego apostrofem

UMESH NITNAWARE
źródło