Saltar al contenido

Cómo identificar / eliminar caracteres que no sean UTF-8 en R

Solución:

Otra solución usando iconv y su argumento sub: cadena de caracteres. Si no es NA (aquí lo configuro en ”), se usa para reemplazar cualquier byte no convertible en la entrada.

x <- "faxE7ile"
Encoding(x) <- "UTF-8"
iconv(x, "UTF-8", "UTF-8",sub='') ## replace any non UTF-8 by ''
"faile"

Aquí tenga en cuenta que si elegimos la codificación correcta:

x <- "faxE7ile"
Encoding(x) <- "latin1"
xx <- iconv(x, "latin1", "UTF-8",sub='')
facile

Yihui xfun el paquete tiene una función, read_utf8, que intenta leer un archivo y asume que está codificado como UTF-8. Si el archivo contiene líneas que no son UTF-8, se activa una advertencia que le informa qué líneas contienen caracteres que no son UTF-8. Debajo del capó utiliza una función no exportada xfun:::invalid_utf8() que es simplemente lo siguiente: which(!is.na(x) & is.na(iconv(x, "UTF-8", "UTF-8"))).

Para detectar palabras específicas que no son UTF-8 en una cadena, puede modificar ligeramente lo anterior y hacer algo como:

invalid_utf8_ <- function(x){

  !is.na(x) & is.na(iconv(x, "UTF-8", "UTF-8"))

}

detect_invalid_utf8 <- function(string, seperator){

  stringSplit <- unlist(strsplit(string, seperator))

  invalidIndex <- unlist(lapply(stringSplit, invalid_utf8_))

  data.frame(
    word = stringSplit[invalidIndex],
    stringIndex = which(invalidIndex == TRUE)
  )

}

x <- "This is a string faxE7ile blah blah blah faxE7ade"

detect_invalid_utf8(x, " ")

#     word stringIndex
# 1 façile    5
# 2 façade    9

Otro enfoque para eliminar los caracteres incorrectos usando dplyr en todo el conjunto de datos:

library(dplyr)

MyDate %>%
    mutate_at(vars(MyTextVar1, MyTextVar2), function(x){gsub('[^ -~]', '', x)})

Donde MyData y MyTextVar son el conjunto de datos y las variables de texto para eliminar las manzanas podridas. Esto puede ser menos sólido que cambiar la codificación, pero a menudo está bien y es más fácil eliminarlos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *