Grazie al commento di 42, sono riuscito a scrivere una funzione per ricodificare il file:
fix.encoding <- function(df, originalEncoding = "latin1") {
numCols <- ncol(df)
for (col in 1:numCols) Encoding(df[, col]) <- originalEncoding
return(df)
}
La carne qui è il comando Encoding(df[, col]) <- "latin1"
, che prende la colonna col
del frame di dati df
e lo converte in formato latin1. Sfortunatamente, Encoding
accetta solo oggetti colonna come input, quindi ho dovuto creare una funzione per eseguire lo sweep di tutte le colonne di un oggetto dataframe e applicare la trasformazione.
Ovviamente, se il tuo problema si trova solo in un paio di colonne, è meglio applicare solo il Encoding
a quelle colonne invece dell'intero dataframe (puoi modificare la funzione sopra per prendere un insieme di colonne come input). Inoltre, se stai affrontando il problema inverso, cioè leggendo un oggetto R creato in Linux o Mac OS in Windows, dovresti usare originalEncoding = "UTF-8"
.
grazie per aver postato questo. Mi sono preso la libertà di modificare la tua funzione nel caso tu abbia un dataframe con alcune colonne come carattere e altre come non carattere. In caso contrario, si verifica un errore:
> fix.encoding(adress)
Error in `Encoding<-`(`*tmp*`, value = "latin1") :
a character vector argument expected
Quindi ecco la funzione modificata:
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)
}
Tuttavia, questo non cambierà la codifica dei nomi dei livelli in una colonna "fattore". Fortunatamente, ho trovato questo per cambiare tutti i fattori nel tuo dataframe in carattere (che potrebbe non essere l'approccio migliore, ma nel mio caso è quello di cui avevo bisogno):
i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.character)
seguendo le risposte precedenti, questo è un aggiornamento minore che lo fa funzionare su fattori e tibble di dplyr. Grazie per l'ispirazione.
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))
}