Grâce au commentaire de 42, j'ai réussi à écrire une fonction pour recoder le fichier :
fix.encoding <- function(df, originalEncoding = "latin1") {
numCols <- ncol(df)
for (col in 1:numCols) Encoding(df[, col]) <- originalEncoding
return(df)
}
La viande ici est la commande Encoding(df[, col]) <- "latin1"
, qui prend la colonne col
de dataframe df
et le convertit au format latin1. Malheureusement, Encoding
ne prend que des objets de colonne en entrée, j'ai donc dû créer une fonction pour balayer toutes les colonnes d'un objet dataframe et appliquer la transformation.
Bien sûr, si votre problème ne concerne que quelques colonnes, vous feriez mieux d'appliquer simplement le Encoding
à ces colonnes au lieu de la trame de données entière (vous pouvez modifier la fonction ci-dessus pour prendre un ensemble de colonnes en entrée). De plus, si vous êtes confronté au problème inverse, c'est-à-dire lire un objet R créé sous Linux ou Mac OS dans Windows, vous devez utiliser originalEncoding = "UTF-8"
.
Merci d'avoir posté ceci. J'ai pris la liberté de modifier votre fonction au cas où vous auriez une base de données avec des colonnes en tant que caractère et d'autres en tant que non-caractère. Sinon, une erreur se produit :
> fix.encoding(adress)
Error in `Encoding<-`(`*tmp*`, value = "latin1") :
a character vector argument expected
Voici donc la fonction modifiée :
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)
}
Cependant, cela ne changera pas l'encodage des noms de niveau dans une colonne "facteur". Heureusement, j'ai trouvé cela pour changer tous les facteurs de votre dataframe en caractère (ce qui n'est peut-être pas la meilleure approche, mais dans mon cas, c'est ce dont j'avais besoin) :
i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.character)
suite aux réponses précédentes, il s'agit d'une mise à jour mineure qui le fait fonctionner sur les facteurs et le tibble de dplyr. Merci pour l'inspiration.
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))
}