apply et remplacement de caractères

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

camille garcin
Messages : 76
Enregistré le : 24 Nov 2009, 10:07

apply et remplacement de caractères

Messagepar camille garcin » 24 Juin 2014, 15:01

Bonjour à tous
J’ai une table ‘champs’ avec des caractères ‘sales’ que je souhaite remplacer par des caractères ‘propres’.
J’obtiens ce que je veux en procédant avec une boucle comme ci-dessous :

Code : Tout sélectionner

#table des correspondance de caracatères à remplacer
corres<-data.frame(sale=c('À','É','É','Ê','È','È','Ü','Ô'),
                    propre=c('À','É','É','È','È','È','Ü','Ô'))

n<-dim(corres)[1]

trim.champs<-function(string)
{
res=string
for (i in 1:n) {res=gsub(corres[i,'sale'],corres[i,'propre'],res,fixed=T)}
return(res)
}

# table propre
Champs<-data.frame(lapply(champs,trim.champs))


Cependant, je souhaiterais savoir s’il est possible d’optimiser le code en utilisant un apply et si oui, lequel ? Merci d’avance pour votre aide.
CG

François Collin
Messages : 32
Enregistré le : 22 Mai 2013, 08:07

Messagepar François Collin » 24 Juin 2014, 16:34

Tu peux optimiser ton code en important d'emblée tes données en renseignant le bon encodage/jeu de caractères du fichier.

Code : Tout sélectionner

read.table(file, ...... , encoding='UTF-8');
François Collin

camille garcin
Messages : 76
Enregistré le : 24 Nov 2009, 10:07

Messagepar camille garcin » 25 Juin 2014, 06:49

Ok. Merci de ta réponse. Mais si je souhaite par exemple remplacer un ensemble de caractères par un autre (indépendamment de tout problème d’encodage) : comment procéder avec un apply ?
CG

François Collin
Messages : 32
Enregistré le : 22 Mai 2013, 08:07

Messagepar François Collin » 25 Juin 2014, 07:22

Si tu y tiens :) :

Code : Tout sélectionner


#table des correspondance de caracateres a remplacer
corres<-data.frame(
  sale=c('À','É','É','Ê','È','È','Ãœ','Ô'),
  propre=c('À','É','É','È','È','È','Ü','Ô'),
  stringsAsFactors=FALSE)

# un exemple de vecteur de characteres a remplacer v_sale ou d'une
# matrice de chracteres m_sale
v_sale <- sample(corres$sale, size=10, replace=TRUE)
m_sale <- matrix(data=sample(corres$sale, size=20, replace=TRUE), nrow=4)

# pour traiter le vecteur
sapply(v_sale, function(x){
  res <- corres$propre[corres$sale==x]
  return(res)
})


# pour traiter une matrice
apply(m_sale, 2, function(x){
 
  res <- sapply(x, function(y){
    res <- corres$propre[corres$sale==y]
    return(res)
  })
 
  return(res)
 
})

François Collin

camille garcin
Messages : 76
Enregistré le : 24 Nov 2009, 10:07

Messagepar camille garcin » 25 Juin 2014, 12:40

Merci à nouveau. Pour revenir à l’encodage, j’ai importé par curiosité mon fichier avec différentes options de encoding : "latin1", "UTF-8", "bytes" ou défaut puis extrait la variable de type character qui m’intéresse. Le résultat est visible ici. Il y a moins d’erreurs avec utf-8 (environ 6 fois moins) qu’avec les autres options mais il y en a encore et je ne comprends pas pourquoi. Pour information, le fichier d’où est extraite la variable est une table d’une base de données avec une ligne par patient (renseignée par le médecin du centre ou le patient est traité) et stockée à l’hopital où je travaille. Y aurait-il un problème au niveau de l’écriture dans la base ? Est-ce possible de corriger cela à mon niveau quand je récupère les données pour les traiter (je ne suis pas administrateur de la base) ?
CG

François Collin
Messages : 32
Enregistré le : 22 Mai 2013, 08:07

Messagepar François Collin » 25 Juin 2014, 12:48

La solution la plus simple est de demander l'encodage à l'administrateur qui pourra te renseigner par ailleurs si des erreurs sont en sa connaissance. Une fois l'encodage connu la communication entre R et n'importe quelle autre source ne devrait pas poser de problème.

Bonne chance
François Collin

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 26 Juin 2014, 09:45

Bonjour,

dans la même veine tu as aussi la fonction iconv qui te permet de modifier l'encodage d'une chaîne de caractère. Ensuite ici ce n'est pas parfait certains de tes caractères ne sont pas modifier :

Code : Tout sélectionner

iconv(corres$sale, "UTF-8", "latin1")
[1] "À"  "É"  "É" "Ê" "È"  "È" "Ü"  "Ô"

# sur des chaînes de caractère :
iconv(paste(corres$sale,collapse=""), "UTF-8", "latin1")
[1] "ÀÉÉÊÈÈÜÔ"
La liste des encodages est disponible avec la fonction iconvlist.

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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