Forzar la codificación del vector de caracteres de "desconocido" a "UTF-8" en R
character-encoding data.table (2)
Tengo un problema con la codificación inconsistente del vector de caracteres en R.
El archivo de texto del que leí una tabla está codificado (a través de Notepad++
) en UTF-8
(también probé con UTF-8 without BOM
).
Quiero leer la tabla de este archivo de texto, convertirla en data.table
, establecer una key
y hacer uso de la búsqueda binaria. Cuando intenté hacerlo, apareció lo siguiente:
Mensaje de advertencia: En
[.data.table
(poli.dt, "żżonymi", mult = "first"): Se detectó una codificación conocida (latin1 o UTF-8) en una columna de unión. data.table compara los bytes actualmente, por lo que no admite bien las codificaciones mixtas ; es decir, utilizando tanto latin1 como UTF-8, o si alguna de las codificaciones desconocidas son no ascii y algunas de ellas están marcadas como conocidas y otras no. Pero si se usa exclusivamente latin1 o UTF-8, y todas las codificaciones desconocidas son ascii, entonces el resultado debería estar bien. En el futuro verificaremos por usted y evitaremos esta advertencia si todo está bien. La parte difícil es hacer esto sin afectar el rendimiento en casos solo de ascii.
y la búsqueda binaria no funciona .
Me di cuenta de que mi columna data.table
- key
consta de los tipos de codificación "desconocido" y "UTF-8":
> table(Encoding(poli.dt$word))
unknown UTF-8
2061312 2739122
Intenté convertir esta columna (antes de crear un objeto data.table
) con el uso de:
-
Encoding(word) <- "UTF-8"
-
word<- enc2utf8(word)
pero sin efecto
También probé algunas formas diferentes de leer un archivo en R (configurando todos los parámetros útiles, por ejemplo, encoding = "UTF-8"
):
-
data.table::fread
-
utils::read.table
-
base::scan
-
colbycol::cbc.read.table
pero sin efecto
==================================================
Mi R.version:
> R.version
_
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 0.3
year 2014
month 03
day 06
svn rev 65126
language R
version.string R version 3.0.3 (2014-03-06)
nickname Warm Puppy
Información de mi sesión:
> sessionInfo()
R version 3.0.3 (2014-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=Polish_Poland.1250 LC_CTYPE=Polish_Poland.1250 LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C LC_TIME=Polish_Poland.1250
base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.9.2 colbycol_0.8 filehash_2.2-2 rJava_0.9-6
loaded via a namespace (and not attached):
[1] plyr_1.8.1 Rcpp_0.11.1 reshape2_1.2.2 stringr_0.6.2 tools_3.0.3
La función de Encoding
devuelve unknown
si una cadena de caracteres tiene una marca de "codificación nativa" (CP-1250 en su caso) o si está en ASCII. Para discriminar entre estos dos casos, llame a:
library(stringi)
stri_enc_mark(poli.dt$word)
Para verificar si cada cadena consta de secuencias de bytes UTF-8 válidas, llame a:
all(stri_enc_isutf8(poli.dt$word))
Si no es el caso, entonces su archivo no está en UTF-8 en absoluto.
Sospecho que no le ha indicado a R mientras leía el archivo que efectivamente está en UTF-8 (debería bastar con mirar el contenido de poli.dt$word
para verificar esta declaración). Si mi suposición es cierta, intente:
read.csv2(file("filename", encoding="UTF-8"))
o
poli.dt$word <- stri_encode(poli.dt$word, "", "UTF-8") # re-mark encodings
Si data.table
aún se queja de las codificaciones "mixtas", es posible que desee transliterar los caracteres que no son ASCII, por ejemplo:
stri_trans_general("Zażółć gęślą jaźń", "Latin-ASCII")
## [1] "Zazolc gesla jazn"
No pude encontrar una solución para un problema similar. No pude volver a traducir los caracteres de codificación desconocidos de un archivo txt en algo más manejable en R.
Por lo tanto, me encontraba en una situación en la que el mismo personaje aparecía más de una vez en el mismo conjunto de datos, porque estaba codificado de manera diferente ("X" en configuración latina y "X" en configuración griega). Sin embargo, la operación de guardar txt conservó esa diferencia de codificación, por supuesto, bien hecha.
Probando algunos de los métodos anteriores, nada funcionó. El problema está bien descrito "no se puede distinguir ASCII de UTF-8 y el bit no se mantendrá incluso si lo configura" .
Una buena solución es "exportar su data.frame a un archivo temporal CSV y volver a importar con data.table :: fread (), especificando Latin-1 como codificación de origen". .
Reproduciendo / copiando el ejemplo dado de la fuente anterior:
package(data.table) df <- your_data_frame_with_mixed_utf8_or_latin1_and_unknown_str_fields fwrite(df,"temp.csv") your_clean_data_table <- fread("temp.csv",encoding = "Latin-1")
Espero que ayude a alguien que.