Les données de type texte

analyses en langage R

Les données de type textes sont difficile à traiter. En effet, on peut vouloir modifier ce texte, comptabiliser le nombre de fois qu'apparaît un mot...

Cela s'avère très utile pour effectuer des remplacement ou rectifier des données "sales" où se mélangent des valeurs numériques (ex : 3) ou écrites (ex : "3 km").

Quelques commandes sont utiles pour traiter le texte et identifier des types de texte (ce que l'on appelle du parsing) :

  • Extraire les premières lettres d'une chaîne de caractères

substring()

  • Pour remplacer dans un tableau ou vecteur des chaînes de caractères (commande gsub)

gsub(",",".",x) # Remplace dans x toutes les , par des .

gsub("Non","Oui",toto) # Remplace dans le vecteur toto tous les Non par des Oui

# un équivalent semble être la commande sub

  • Pour concaténer du texte avec des variables

mon_texte <- "Le paramètre X vaut : "

ma_variable_x <- 2.3

collage <- paste(mon_texte,ma_variable_x)

collage

# collage peut s'afficher alors dans la console avec la commande cat ou sur un graphique avec la commande text.

  • Pour couper du texte au niveau d'un ou plusieurs caractère

mon_texte <- c("33,32")

#install.packages("stringr", dependencies=TRUE) # Supprimer le # selon les besoins

#library(stringr)

str_split_fixed(mon_texte, ",",2)

  • Convertir des valeurs de type texte en valeurs numériques (commande as.numeric)

x <- c("1.0","2.3","4") # ici x est de type caractère, il est impossible de calculer x/2

x <- as.numeric(x) # x est maintenant numérique

  • Compter le nombre de fois qu'apparaît une expression dans un vecteur texte (commande grep)

Transport = c("Votre voiture et moi","Votre voiture","Votre vélo","Vos pieds","Vos pieds et votre Voiture")

length(grep("Votre voiture",Transport)) # Va compter le nombre de fois qu'apparaît dans le vecteur Transport "Votre voiture" avec un "V" majuscule pour Votre.

# grep en réalité retourne la position où apparaît cette expression dans le vecteur - length convertit cela en nombre de fois

# On peut aussi chercher une expression

length(gregexpr("TRUC",dat)[[1]]) # si on supprime le [[1]], cela compte dans tout le vecteur et non la seule position 1

  • Convertir toutes les lettres en majuscule

noms = toupper(noms)

  • Format d'écriture (encodage)

Il est important de définir le format d'écriture pour ne pas avoir des problèmes avec les caractères spéciaux ou des chaînes de caractères identiques en apparence qui ne seraient pas reconnus comme tel à cause d'un format d'écriture différent.

# Si caractères spéciaux dans q (caractères grecs, accents français : les rendre reconnaissables)

Encoding(levels(q)) <- "UTF-8"

# Une petite suite de commande pour obliger un texte d'un fichier à caractères spéciaux à être bien reconnus et comparable avec des variables en codage de base sous R

Encoding(levels(q)) <- "UTF-8"

q = as.character(q) ;

q = enc2native(q)

  • Remplacer les virgules par des points

Exemple : Un fichier exporté peut présenter des "," à la place de ".", or R ne reconnait que les nombres réels dont les décimales sont séparées par un point.Il faut donc remplacer les "," par "." avant d'ouvrir le fichier OU ENCORE remplacer les "," par des "." une fois que le fichier est ouvert.

# Soit un vecteur contenant des réels à virgules

Somme = c("2,3","2,6","2,8")

# Voici le code qui transforme ce vecteur

substi<-function(x) {gsub(",",".",x) }

Somme = substi(Somme)

Somme = as.numeric(Somme);Somme

  • Nettoyer un texte de ses caractères spéciaux

Unaccent <- function(text) {

text <- gsub("Ç","C",text); text <- gsub("ç","c",text); text <- gsub("é","e",text); text <- gsub("È","e",text);

text <- gsub("î","i",text); text <- gsub("ï","i",text); text <- gsub("è","e",text); text <- gsub("ê","e",text);

text <- gsub(" ","_",text); text <- gsub("-","_",text); text <- gsub("['`^~\"]", " ", text)

text <- iconv(text, to="ASCII//TRANSLIT//IGNORE"); text <- gsub("['`^~\"]", "", text)

return(text)

}

texte_propre <- Unaccent(texte_sale)

  • substr() pour récupérer des caractères par leur position

# Manière aléatoire pour avoir des codes à 3 chiffres - tous compris

x <- c(1000:1999) ; x <- as.character(x) ; substr(x, 2, nchar(x))

code <- sample(x, 50) # 50 codes aléatoires à coller à une variable avec paste()

Aller plus loin:

Expression régulières avec R (RegExp, RegEx)

library("stringr")

chain <- c("tagadag soin tsoin","vive les raviolis et le thé","Georges Duroy est un coquin.","Je vais aller voir Mathilde.","****")


str_detect(chain,pattern="a.a") # trouve aga*

str_detect(chain,pattern="l*") # cherche 0 ou plusieurs l

str_detect(chain,pattern="l+") # cherche l 1 ou plusieurs l

str_detect(chain,pattern="^t") # que ma chaine commence par t

str_detect(chain,pattern="a.[a,i]") # cherche a?a ou a?i

str_detect(chain,pattern="a.[a-i]") # cherche continuité a?a a?b a?c jusque a?i

Chercher un Prénom , Un nom + Prénom :

str_extract(chain,pattern="^[A-Z][a-z]*\\s[A-Z]") # Nom Prénom ou Prénom Nom

\\s = espace

Récupérer les ****

str_extract(chain,pattern="\\*\\*\\*\\*") # 4 étoiles

str_extract(chain,pattern="\\*{4}") # 4 étoiles

str_extract(chain,pattern="\\*+") # Tout motif de n étoiles