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