Remplacer une sous-chaine de caractère par match()

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Louërat Robin
Messages : 12
Enregistré le : 16 Juil 2019, 14:59

Remplacer une sous-chaine de caractère par match()

Messagepar Louërat Robin » 09 Aoû 2019, 07:25

Bonjour,

Je pense que mon problème se résout avec les fonctions du package stringr et la fonction match() mais je ne trouve pas comment.

J'ai un dataframe `airports` avec une colonne `municipality`qui est dès le téléchargement mal encodée.
J'ai créé un autre dataframe (qui s'appelle `encodage`) avec 2 colonnes, la première qui contient les lettres avec accents (colonne UTF) et la seconde avec leur valeur quand elles sont mal encodées en UTF-8 (colonne Erreur)
exemple de ligne dans ce dataframe :

UTF Erreur
\200 €
‚ â\200š
ƒ Æ’
„ â\200ž
Ö Ã–

Maintenant j'aimerai que ma variable municipality soit corrigée dans le cas où elle contient une valeur présente dans encodage$Erreur par sa valeur correspondante dans encodage$UTF

exemple : Ölanda devient Ölanda

Merci d'avance

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Remplacer une sous-chaine de caractère par match()

Messagepar Mickael Canouil » 09 Aoû 2019, 08:58

Bonjour,

les fonctions de stringr sont "autonomes", vous n'avez pas besoin de match (base).

Vous parlez ici de problème d'encodage, pourquoi ne pas corriger ce problème dès le "départ" ?
Soit dans la fonction qui vous sert à importer vos données, soit avec les nombreuses fonctions de conversion d'encodage, par exemple si on reste sur le package stringr, la fonction stringr::str_conv().

Sinon la fonction str_replace (toujours dans le package stringr), mais il faut changer la forme de votre table de conversion.
Au passage, cette approche de construire la table de conversion est une approche laborieuse et source d'erreur.

Code : Tout sélectionner

df <- structure(
  list(
    UTF = c("<80>", "‚", "ƒ", "„", "Ö"),
    Erreur = c("€", "â<80>š", "Æ’", "â<80>ž", "Ö")
  ),
  class = "data.frame",
  row.names = c(NA, -5L)
)


vector_conv <- df[["UTF"]]
names(vector_conv) <- df[["Erreur"]]


set.seed(20190809)
test_vector <- sample(c(letters, c("€", "â<80>š", "Æ’", "â<80>ž", "Ö")))
test_vector
#>  [1] "d"      "o"      "i"      "b"      "Ö"     "€"    "s"     
#>  [8] "f"      "j"      "x"      "w"      "g"      "t"      "y"     
#> [15] "n"      "k"      "r"      "a"      "m"      "â<80>š" "z"     
#> [22] "q"      "u"      "l"      "â<80>ž" "Æ’"     "c"      "p"     
#> [29] "v"      "h"      "e"


stringr::str_replace_all(test_vector, vector_conv)
#>  [1] "d"    "o"    "i"    "b"    "Ö"    "<80>" "s"    "f"    "j"    "x"   
#> [11] "w"    "g"    "t"    "y"    "n"    "k"    "r"    "a"    "m"    "‚"   
#> [21] "z"    "q"    "u"    "l"    "„"    "ƒ"    "c"    "p"    "v"    "h"   
#> [31] "e"


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Louërat Robin
Messages : 12
Enregistré le : 16 Juil 2019, 14:59

Re: Remplacer une sous-chaine de caractère par match()

Messagepar Louërat Robin » 09 Aoû 2019, 09:22

Bonjour Mickael,

Je ne peux pas corriger dès le départ car c'est avant même de télécharger, les données ne sont pas propres à la base.
Pour stringr::str, en executant la commande

Code : Tout sélectionner

airports %>% mutate(municipality2 = str_conv(municipality, "UTF-8"))

ou

Code : Tout sélectionner

airports %>% mutate(municipality2 = str_conv(municipality, "UTF8"))

Je n'ai aucun changement ...

Merci pour votre seconde proposition que je vais peut-être tester, mais j'ai 130 lignes dans ma table de conversion alors ça risque d'être TRES long

Cordialement

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Remplacer une sous-chaine de caractère par match()

Messagepar Mickael Canouil » 09 Aoû 2019, 09:30

Quand je dis dès le départ, je parle de l'importation dans R.
Le fichier est peut-être dans un encodage particulier, mais il suffit de le lire dans le bon pour que les caractères apparaissent correctement.
Le seul cas où ce n'est pas possible c'est lorsqu'il y a un "mélange" d'encodage.

Au passage le bon nom d'encodage est "UTF-8"
str_conv {stringr} R Documentation
Specify the encoding of a string.

Description
This is a convenient way to override the current encoding of a string.

Usage
str_conv(string, encoding)

Arguments
string String to re-encode.
encoding Name of encoding. See stringi::stri_enc_list() for a complete list.

Examples
# Example from encoding?stringi::stringi
x <- rawToChar(as.raw(177))
x
str_conv(x, "ISO-8859-2") # Polish "a with ogonek"
str_conv(x, "ISO-8859-1") # Plus-minus


Code : Tout sélectionner

stringi::stri_enc_list(simplify = FALSE)


Faute d'avoir un exemple reproductible, il n'est pas possible de founir une réponse plus détaillée :
Mickaël
mickael.canouil.fr | rlille.fr

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Remplacer une sous-chaine de caractère par match()

Messagepar Serge Rapenne » 09 Aoû 2019, 13:05

Bonjour,

pour compléter la réponse de Mickael, je ne sait pas comment tu charges tes données mais si c'est grâce à la fonction read.table, cette fonction admet le paramètre "fileEncoding" qui permet de spécifier l'encodage utilisé par le fichier.
qq chose comme ça :

Code : Tout sélectionner

dta<-read.table(mon_fichier,fileEncoding="UTF-8") #charge un fichier en encodage UTF-8
dta<-read.table(mon_fichier,fileEncoding="Windows-1252") #charge un fichier venant du monde "Windows"


Serge


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité