GNU/Linux >> Znalost Linux >  >> Linux

Čtení souboru Rdata s jiným kódováním

Díky komentáři 42 se mi podařilo napsat funkci pro překódování souboru:

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

Maso je zde příkaz Encoding(df[, col]) <- "latin1" , který zabírá sloupec col datového rámce df a převede jej do formátu latin1. Bohužel Encoding Jako vstup bere pouze objekty sloupců, takže jsem musel vytvořit funkci, která smaže všechny sloupce objektu dataframe a aplikuje transformaci.

Samozřejmě, pokud je váš problém pouze v několika sloupcích, je lepší použít Encoding do těchto sloupců místo celého datového rámce (výše uvedenou funkci můžete upravit tak, aby jako vstup vzala sadu sloupců). Také, pokud čelíte inverznímu problému, tj. čtení objektu R vytvořeného v Linuxu nebo Mac OS do Windows, měli byste použít originalEncoding = "UTF-8" .


Děkujeme, že jste to zveřejnili. Dovolil jsem si upravit vaši funkci v případě, že máte datový rámec s některými sloupci jako znakovými a některými jako bezznakovými. V opačném případě dojde k chybě:

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

Zde je tedy upravená funkce:

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)
}

Tím se však nezmění kódování názvů úrovní ve sloupci "faktor". Naštěstí jsem to zjistil, abych změnil všechny faktory ve vašem datovém rámci na znak (což nemusí být nejlepší přístup, ale v mém případě je to to, co jsem potřeboval):

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

v návaznosti na předchozí odpovědi se jedná o menší aktualizaci, díky které funguje na faktory a dplyr's tibble. Díky za inspiraci.

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. Přesouvat soubory čtením jejich názvů souborů do různých adresářů?

  2. Nahradit nový řádek nulou?

  3. Čtení řádků ze souboru s Bash:For vs. Zatímco?

  1. Čtení Grepových vzorů ze souboru?

  2. Upozornění s nftw

  3. Vykreslete soubor .gnu pomocí gnuplot

  1. Kódování souboru ZIP?

  2. Oprávnění souborů v Linuxu s příkladem

  3. Je mv se zástupným znakem stále atomický