¿Eliminar todos los caracteres especiales de una cadena en R?

116

¿Cómo eliminar todos los caracteres especiales de la cadena en R y reemplazarlos con espacios?

Algunos caracteres especiales para eliminar son: ~!@#$%^&*(){}_+:"<>?,./;'[]-=

Lo intenté regexcon el [:punct:]patrón, pero solo elimina los signos de puntuación.

Pregunta 2: ¿Y cómo eliminar caracteres de idiomas extranjeros como â í ü Â á ą ę ś ć:?

Respuesta: Úselo [^[:alnum:]]para eliminar ~!@#$%^&*(){}_+:"<>?,./;'[]-=y use [^a-zA-Z0-9]para eliminar también â í ü Â á ą ę ś ćen funciones regexo regexpr.

Qbik
fuente
4
¿Cuál es la definición de "carácter especial"?
kohske
Mi propia definición sería cada carácter que no esté en Unicode ;-). Pero supongo que muchas otras personas no estarían de acuerdo.
Joey
Tal vez eche un vistazo a subo gsubfunciones.
Paul Hiemstra
5
regex [: punct:] va a hacer la mitad del trabajo o mayby ​​all
Qbik

Respuestas:

196

Debe utilizar expresiones regulares para identificar los caracteres no deseados. Para obtener el código más fácil de leer, desea el str_replace_alldel stringrpaquete, aunque gsubdesde la base R funciona igual de bien.

La expresión regular exacta depende de lo que intente hacer. Puede eliminar los caracteres específicos que proporcionó en la pregunta, pero es mucho más fácil eliminar todos los caracteres de puntuación.

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

(El equivalente de R base es gsub("[[:punct:]]", " ", x).)

Una alternativa es intercambiar todos los caracteres no alfanuméricos.

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

Tenga en cuenta que la definición de lo que constituye una letra, un número o un signo de puntuación varía ligeramente según su ubicación, por lo que es posible que deba experimentar un poco para obtener exactamente lo que desea.

Richie algodón
fuente
11
buenas respuestas +1 Es posible que desee reemplazar el " "con, de lo ""contrario, tendrá un espacio en blanco vacío en la cadena.
Tyler Rinker
8
@TylerRinker: Cierto, aunque QBik pidió específicamente espacios.
Richie Cotton
8
¿Cómo eliminar remowe esos personajes locos â í ü Â á:?
Qbik
1
Necesita leer sobre las expresiones regulares. Comience con el enlace en mi respuesta y luego lea ?regexy ?regexpr.
Richie Cotton
1
Intente reemplazar [^[:alnum:]]con [^a-zA-Z0-9]o posiblemente \\W.
Richie Cotton
27

En lugar de usar expresiones regulares para eliminar esos caracteres "locos", simplemente conviértalos a ASCII, lo que eliminará los acentos, pero conservará las letras.

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

lo que resulta en

[1] "Abcdeacoauu"
Felipe Alvarenga
fuente
Tuve que agregar iconv(astr, from="UFT-8", to="ASCII//TRANSLIT"), de lo contrario, con caracteres franceses, çse vuelve un poco divertido.
Duccio A
8

Convierta los caracteres especiales en apóstrofo,

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

A continuación, codifique para eliminar el apóstrofo adicional '' '

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

Utilice la gsub(..)función para reemplazar el carácter especial con apóstrofo

NITNAWARE UMESH
fuente