Supprimer tous les caractères spéciaux d'une chaîne dans R?

118

Comment supprimer tous les caractères spéciaux de la chaîne dans R et les remplacer par des espaces?

Certains caractères spéciaux à supprimer sont: ~!@#$%^&*(){}_+:"<>?,./;'[]-=

J'ai essayé regexavec le [:punct:]motif mais cela ne supprime que les signes de ponctuation.

Question 2: Et comment supprimer des caractères de langues étrangères comme â í ü Â á ą ę ś ć:?

Réponse: Utilisez [^[:alnum:]]pour enlever ~!@#$%^&*(){}_+:"<>?,./;'[]-=et utiliser [^a-zA-Z0-9]pour supprimer également â í ü Â á ą ę ś ćdans regexou regexprfonctions.

Qbik
la source
4
Quelle est la définition de «caractère spécial»?
kohske
Ma propre définition serait chaque caractère qui n'est pas en Unicode ;-). Mais je suppose que beaucoup d'autres personnes seraient en désaccord.
Joey
Peut-être jeter un oeil à subou gsubfonctions.
Paul Hiemstra
5
regex [: punct:] va faire la moitié du travail ou peut-être tous
Qbik

Réponses:

197

Vous devez utiliser des expressions régulières pour identifier les caractères indésirables. Pour le code le plus facilement lisible, vous voulez le str_replace_alldu stringrpackage, bien gsubqu'à partir de la base R fonctionne aussi bien.

L'expression régulière exacte dépend de ce que vous essayez de faire. Vous pouvez simplement supprimer les caractères spécifiques que vous avez indiqués dans la question, mais il est beaucoup plus facile de supprimer tous les caractères de ponctuation.

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

(L'équivalent de base R est gsub("[[:punct:]]", " ", x).)

Une alternative consiste à échanger tous les caractères non alphanumériques.

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

Notez que la définition de ce qui constitue une lettre, un chiffre ou un signe de ponctuation varie légèrement en fonction de vos paramètres régionaux, vous devrez donc peut-être expérimenter un peu pour obtenir exactement ce que vous voulez.

Coton Richie
la source
11
nice answers +1 Vous voudrez peut-être remplacer le " "par ""sinon vous avez un espace blanc vide dans la chaîne.
Tyler Rinker
8
@TylerRinker: C'est vrai, bien que QBik ait spécifiquement demandé des espaces.
Richie Cotton
8
Comment supprimer remowe ces personnages loufoques: â í ü Â á?
Qbik
1
Vous devez vous renseigner sur les expressions régulières. Commencez par le lien dans ma réponse, puis lisez ?regexet ?regexpr.
Richie Cotton
1
Essayez de remplacer [^[:alnum:]]par [^a-zA-Z0-9]ou éventuellement \\W.
Richie Cotton
28

Au lieu d'utiliser regex pour supprimer ces caractères "fous", convertissez-les simplement en ASCII, ce qui supprimera les accents, mais conservera les lettres.

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

ce qui se traduit par

[1] "Abcdeacoauu"
Felipe Alvarenga
la source
Je devais ajouter iconv(astr, from="UFT-8", to="ASCII//TRANSLIT"), sinon avec des caractères français comme çça va un peu drôle.
Duccio A
8

Convertissez les caractères spéciaux en apostrophe,

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

Codez-le ci-dessous pour supprimer une apostrophe supplémentaire

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

Utilisez la gsub(..)fonction pour remplacer le caractère spécial par une apostrophe

UMESH NITNAWARE
la source