GNU/Linux >> Tutoriales Linux >  >> Linux

Lectura de archivos Rdata con codificación diferente

Gracias al comentario de 42, logré escribir una función para recodificar el archivo:

fix.encoding <- function(df, originalEncoding = "latin1") {
  numCols <- ncol(df)
  for (col in 1:numCols) Encoding(df[, col]) <- originalEncoding
  return(df)
}

La carne aquí es el comando Encoding(df[, col]) <- "latin1" , que toma la columna col del marco de datos df y lo convierte a formato latin1. Desafortunadamente, Encoding solo toma objetos de columna como entrada, por lo que tuve que crear una función para barrer todas las columnas de un objeto de marco de datos y aplicar la transformación.

Por supuesto, si su problema está en solo un par de columnas, es mejor que simplemente aplique el Encoding a esas columnas en lugar de todo el marco de datos (puede modificar la función anterior para tomar un conjunto de columnas como entrada). Además, si enfrenta el problema inverso, es decir, leer un objeto R creado en Linux o Mac OS en Windows, debe usar originalEncoding = "UTF-8" .


Gracias por publicar esto. Me tomé la libertad de modificar su función en caso de que tenga un marco de datos con algunas columnas como carácter y otras como no carácter. De lo contrario, se produce un error:

> fix.encoding(adress)
Error in `Encoding<-`(`*tmp*`, value = "latin1") :
 a character vector argument expected

Así que aquí está la función modificada:

fix.encoding <- function(df, originalEncoding = "latin1") {
    numCols <- ncol(df)
    for (col in 1:numCols)
            if(class(df[, col]) == "character"){
                    Encoding(df[, col]) <- originalEncoding
            }
    return(df)
}

Sin embargo, esto no cambiará la codificación de los nombres de nivel en una columna de "factor". Afortunadamente, encontré esto para cambiar todos los factores en su marco de datos a carácter (que puede no ser el mejor enfoque, pero en mi caso eso es lo que necesitaba):

i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.character)

siguiendo las respuestas anteriores, esta es una actualización menor que hace que funcione en factores y tibble de dplyr. Gracias por la inspiración.

fix.encoding <- function(df, originalEncoding = "UTF-8") {
numCols <- ncol(df)
df <- data.frame(df)
for (col in 1:numCols)
{
        if(class(df[, col]) == "character"){
                Encoding(df[, col]) <- originalEncoding
        }

        if(class(df[, col]) == "factor"){
                        Encoding(levels(df[, col])) <- originalEncoding
}
}
return(as_data_frame(df))
}

Linux
  1. ¿Mover archivos leyendo sus nombres de archivo a diferentes directorios?

  2. ¿Reemplazar nueva línea con Nul?

  3. ¿Codificación de un archivo zip?

  4. Lectura de líneas de un archivo con Bash:para vs. ¿Mientras?

  5. ¿Leyendo patrones Grep de un archivo?

Comando de cola de Linux con ejemplos

Comando WC de Linux con ejemplos

Comenzando con ls

Firmas digitales con GnuPG

¿Cómo rellenar un archivo con FF usando dd?

¿mv con comodín sigue siendo atómico?