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.