2015-12-01 4 views
5

J'ai un fichier .RData à lire sur ma machine Linux (UTF-8), mais je sais que le fichier est en Latin1 parce que je les ai créés moi-même sous Windows. Malheureusement, je n'ai pas accès aux fichiers d'origine ou à une machine Windows et j'ai besoin de lire ces fichiers sur ma machine Linux. Pour lire un fichier Rdata, la procédure normale consiste à exécuter load("file.Rdata"). Des fonctions telles que read.csv ont un argument encoding que vous pouvez utiliser pour résoudre ce genre de problèmes, mais load n'a rien de tel. Si j'essaie load("file.Rdata", encoding = latin1), je viens d'obtenir ce (prévu) Erreur:Lecture du fichier Rdata avec un codage différent

Error in load("file.Rdata", encoding = "latin1") : unused argument (encoding = "latin1")

Que puis-je faire d'autre? Mes fichiers sont chargés avec des variables de texte contenant des accents qui sont corrompus lorsqu'ils sont ouverts dans un environnement UTF-8.

+2

Les fichiers RData n'ont pas d'encodage. Vous devez charger le Rdata sérialisé, puis réencoder les valeurs une fois qu'elles sont dans l'espace de travail R. Si cela reste flou après avoir lu '' Encoding', alors faites le chargement et publiez la sortie de 'dput (head (object))'. –

+0

@ 42, cela semble résoudre le problème, trop mauvais apparemment, je dois appliquer 'Encoding (x)' à chaque vecteur dans ma base de données. Je vais y jeter un coup d'oeil et je reviendrai vers vous. –

+0

Vous pouvez enregistrer les noms dans l'espace de travail avant et après le chargement, puis travailler sur la différence pour les éléments qui ont des valeurs de caractères. –

Répondre

3

Merci 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 est la commande ici Encoding(df[, col]) <- "latin1", qui prend la colonne col de dataframe df et le convertit au format latin1 . Malheureusement, Encoding ne prend en entrée que des objets de colonne, j'ai donc dû créer une fonction pour balayer toutes les colonnes d'un objet de base de données et appliquer la transformation.

Bien sûr, si votre problème ne concerne que quelques colonnes, il est préférable d'appliquer simplement Encoding à ces colonnes plutôt qu'à l'ensemble de la structure (vous pouvez modifier la fonction ci-dessus pour prendre un ensemble de colonnes en entrée). En outre, si vous faites face au problème inverse, c'est-à-dire en lisant un objet R créé sous Linux ou Mac OS dans Windows, vous devez utiliser originalEncoding = "UTF-8".

1

Merci d'avoir posté ce message. J'ai pris la liberté de modifier votre fonction dans le cas où vous avez un dataframe avec certaines colonnes comme caractère et d'autres comme non-caractère. Dans le cas contraire, 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, je trouve que cela change tous les facteurs dans votre dataframe à caractère (qui peut être pas la meilleure approche, mais dans mon cas, c'est ce que je avais besoin):

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

suite aux réponses précédentes, c'est mineur mise à jour qui le fait fonctionner sur les facteurs et le dplyr's. 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)) 
}