Entfernen Sie alle Sonderzeichen aus einer Zeichenfolge in R?

116

Wie entferne ich alle Sonderzeichen aus der Zeichenkette in R und ersetze sie durch Leerzeichen?

Einige zu entfernende Sonderzeichen sind: ~!@#$%^&*(){}_+:"<>?,./;'[]-=

Ich habe es regexmit [:punct:]Muster versucht , aber es entfernt nur Satzzeichen.

Frage 2: Und wie entferne ich Zeichen aus Fremdsprachen wie : â í ü Â á ą ę ś ć?

Antwort: [^[:alnum:]]Zum Entfernen ~!@#$%^&*(){}_+:"<>?,./;'[]-=und [^a-zA-Z0-9]zum Entfernen auch â í ü Â á ą ę ś ćin regexoder regexprFunktionen.

Qbik
quelle
4
Was ist die Definition von "Sonderzeichen"?
Kohske
Meine eigene Definition wäre jedes Zeichen, das nicht in Unicode ist ;-). Aber ich denke, viele andere Leute würden dem nicht zustimmen.
Joey
Vielleicht einen Blick auf suboder gsubFunktionen.
Paul Hiemstra
5
Regex [: punct:] wird die Hälfte des Jobs machen oder vielleicht alle
Qbik

Antworten:

196

Sie müssen reguläre Ausdrücke verwenden , um die unerwünschten Zeichen zu identifizieren. Für den am leichtesten lesbaren Code möchten Sie den str_replace_allaus dem stringrPaket, obwohl gsubvon Basis R genauso gut funktioniert.

Der genaue reguläre Ausdruck hängt davon ab, was Sie versuchen zu tun. Sie können nur die spezifischen Zeichen entfernen, die Sie in der Frage angegeben haben, aber es ist viel einfacher, alle Satzzeichen zu entfernen.

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

(Das Basis-R-Äquivalent ist gsub("[[:punct:]]", " ", x).)

Eine Alternative besteht darin, alle nicht alphanumerischen Zeichen auszutauschen.

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

Beachten Sie, dass die Definition eines Buchstabens, einer Zahl oder eines Interpunktionszeichens je nach Gebietsschema geringfügig variiert. Daher müssen Sie möglicherweise ein wenig experimentieren, um genau das zu erhalten, was Sie möchten.

Richie Cotton
quelle
11
nette Antworten +1 Vielleicht möchten Sie die ersetzen " "mit ""sonst haben Sie die leeren weißen Raum in der Zeichenkette.
Tyler Rinker
8
@ TylerRinker: Stimmt, obwohl QBik speziell nach Leerzeichen gefragt hat.
Richie Cotton
8
Wie lösche ich diese verrückten Charaktere â í ü Â á?
Qbik
1
Sie müssen sich über reguläre Ausdrücke informieren. Beginnen Sie mit dem Link in meiner Antwort und lesen Sie dann ?regexund ?regexpr.
Richie Cotton
1
Versuchen Sie es [^[:alnum:]]mit [^a-zA-Z0-9]oder möglicherweise zu ersetzen \\W.
Richie Cotton
27

Anstatt Regex zu verwenden, um diese "verrückten" Zeichen zu entfernen, konvertieren Sie sie einfach in ASCII, wodurch Akzente entfernt werden, die Buchstaben jedoch erhalten bleiben.

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

was in ... endet

[1] "Abcdeacoauu"
Felipe Alvarenga
quelle
Ich musste hinzufügen iconv(astr, from="UFT-8", to="ASCII//TRANSLIT"), sonst geht es mit französischen Charakteren çein bisschen komisch.
Duccio A
8

Konvertieren Sie die Sonderzeichen in Apostroph,

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

Unten codieren Sie es, um zusätzliche Apostrophe zu entfernen

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

Verwenden Sie die gsub(..)Funktion, um das Sonderzeichen durch Apostroph zu ersetzen

UMESH NITNAWARE
quelle