Chapitre 9 Manipuler le texte et les dates
9.1 Manipulation des chaînes de caractères
La manipulation des chaines de caractères est essentielle dans le traitement des données. On peut trouver des données textuelles sur réseaux sociaux par exemple. La plupart du temps, ces données sont brutes et il faut donc manipuler le texte pour en extraire les informations importantes.
Pour manipuler des chaines de caractères, il faut bien entendu que les données soit de type caractère. On peut vérifier cela avec la fonction class()
et as.character()
si une conversion est nécessaire.
<- c("Luca","Ambra","Francesco")
x class(x)
## [1] "character"
9.1.1 Concaténer des chaînes
La fonction paste()
permet de concaténer des chaînes de caractères.
paste(c("Hello"), c("Luca","Ambra","Francesco"), sep = "_")
## [1] "Hello_Luca" "Hello_Ambra" "Hello_Francesco"
Ici, on profite du phénomène de réplication de R pour éviter de répéter le premier vecteur.
On peut aussi utiliser la fonction cat()
qui à le même rôle que la fonction print()
.
cat("Bonjour", "\n" ,"Une nouvelle ligne","\n" ,"\t", "une tabulation", "\n", "\"", "une expression entre guillemets","\"")
## Bonjour
## Une nouvelle ligne
## une tabulation
## " une expression entre guillemets "
Des caractères d’échapement sont présents dans l’exemple précédent. On peut en recontrer d’autres mais les plus fréquents sont le retour à la ligne \n
, souvent utilisé dans des titres de graphique et la tabulation \t
permettant notament d’importer des données quand le séparateur correspond à ce dernier.
9.1.2 Majuscule et minuscule
Les fonctions toupper()
et toloweer()
permettent de modifier la casse. Rappelons que le langage R en est sensible tout comme la plupart des langages de programmation.
toupper(x)
## [1] "LUCA" "AMBRA" "FRANCESCO"
tolower(x)
## [1] "luca" "ambra" "francesco"
9.1.3 Longueur d’une chaîne
On peut utiliser la fonction nchar()
pour compter la longueur d’une chaîne. Attention, l’espace est considéré comme un caractère.
nchar(x)
## [1] 4 5 9
9.1.4 Extraction de sous-chaînes
La fonction substr()
permet d’extraire certains élèments d’une chaîne de caractère à partir de leur position.
substr(x,start = 1,stop = 3)
## [1] "Luc" "Amb" "Fra"
Pour extraire la fin d’une chaîne de catactère, il est recommandé d’utiliser le package stringr avec la fonction str_sub()
.
library(stringr)
str_sub(string = x,start = -3,end = -1)
## [1] "uca" "bra" "sco"
9.1.5 Remplacement de chaînes
La fonction gsub()
permet de remplacer un motif recherché par une autre chaîne de caractère.
<- paste(c("Hello"), c("Luca","Ambra","Francesco"), sep = "_")
x x
## [1] "Hello_Luca" "Hello_Ambra" "Hello_Francesco"
<- gsub(pattern = "_",replacement = " ",x)
x x
## [1] "Hello Luca" "Hello Ambra" "Hello Francesco"
9.1.6 Décomposition d’une chaîne
On utilise la fonction strsplit()
pour décomposer une chaîne de caractère selon un motif. Le résultat renvoyé est une liste.
strsplit(x,split = " ")
## [[1]]
## [1] "Hello" "Luca"
##
## [[2]]
## [1] "Hello" "Ambra"
##
## [[3]]
## [1] "Hello" "Francesco"
9.1.7 Recherche de sous-chaîne
La fonction grep()
permet de rechercher les élèments d’un vecteur composé du motif.
x
## [1] "Hello Luca" "Hello Ambra" "Hello Francesco"
grep(pattern = "Am", x)
## [1] 2
La fonction grepl()
plus utile, permet de renvoyer TRUE
ou FALSE
si le motif est présent dans la chaîne.
x
## [1] "Hello Luca" "Hello Ambra" "Hello Francesco"
grepl(pattern = "Am", x)
## [1] FALSE TRUE FALSE
9.1.8 Aller plus loin
Les fonctions que propose le package base permettent de couvrir l’essentiel des méthodes de traitement de texte. Néanmoins, le package stringr de la suite tidyverse propose des fonctionnalités bien plus avancées. Julien Barnier en propose une immersion dans son tutoriel (vers le tutoriel).
Il est possible d’utiliser des expressions régulières lorsqu’on utilise des fonctions de traitements de texte. Ricco Rakotomalala en propose d’ailleurs une esquisse dans son tutoriel.
Voici un petit exemple de vérification d’adresse mail à partir d’une expression régulière :
<- c("steve_aoki@gmail.com",
emails "@jdoreofficiel",
"castex_jean@gouv.fr")
<- "^[[:alnum:].-_]+@[[:alnum:].-]+$"
regex ::str_match(emails, regex) stringr
## [,1]
## [1,] "steve_aoki@gmail.com"
## [2,] NA
## [3,] "castex_jean@gouv.fr"
9.2 Manipulation des dates
9.2.1 Les dates
Les dates sont stockées comme le nombre de jours depuis 1970-01-01, avec des valeurs négatives pour les dates antérieures. Par défaut, R reconnait le format date si la chaîne de caractère est sous la forme yyyy-mm-dd.
Néanmoins, lorsque ce n’est pas le cas on utilsie la fonction as.Date()
qui convertit une chaîne de caractères en date.
<- as.Date("2018-07-15")
d class(d)
## [1] "Date"
unclass(d)
## [1] 17727
Dans l’exemple ci-dessus, cela fonctionne très bien car la chaîne de caractère correspond parfaitement au format interpréter par défaut de R.
Lorsque ce n’est pas le cas, il faut indiquer à R comment interpréter la chaîne de caractère en tant que date. On utilise la table de référence présente dans l’aide en executant la commande help(strptime)
.
<- as.Date("2018 15 07", format = ("%Y %d %m"))
d d
## [1] "2018-07-15"
<- as.Date("15 Juillet, 2018", format = ("%d %B, %Y"))
d d
## [1] "2018-07-15"
Voici un tableau récapitulatif :
Ce tableau permet donc également de gérer le temps (heures, minutes, secondes) quand ces valeurs sont renseignées dans une chaîne de caractères.
9.2.2 L’horloge
Le classe POSIXct
est une des classes date pouvant gérer la date et l’horloge. Cette classe stocke les dates en secondes depuis 1970-01-01 01:00:00
<- as.POSIXct("2018-07-15 19:00:00")
d unclass(d)
## [1] 1531674000
## attr(,"tzone")
## [1] ""
unclass(as.POSIXct("1970-01-01 01:00:00"))
## [1] 0
## attr(,"tzone")
## [1] ""
La classe POSIXlt
stocke la date et l’horloge sous forme de liste dont les éléments correspondent. Attention, ici l’année de référence semble être l’année 1900.
<- as.POSIXlt("2018-07-15 19:00:00")
d unlist(unclass(d))
## sec min hour mday mon year wday yday isdst zone gmtoff
## "0" "0" "19" "15" "6" "118" "0" "195" "1" "CEST" NA
$hour d
## [1] 19
$year d
## [1] 118
Dans le cas où la chaîne de caractère ne respectère pas le format par défaut. On utilise le même procédé que pour la classe date
.
<- as.POSIXct("2018 15 07 190000", format = ("%Y %d %m %H%M%S"))
d d
## [1] "2018-07-15 19:00:00 CEST"
<- as.POSIXlt("15 Juillet, 2018 à 19h00 et 00s",
d format = ("%d %B, %Y à %Hh%M et %Ss"))
d
## [1] "2018-07-15 19:00:00 CEST"
9.2.3 Calcul sur les dates
La fonction difftime() permet de calculer une différence entre deux dates. On peut s’en servir par exemple pour calculer un temps d’execution d’un programme.
help(difftime)
<- Sys.time()
debut Sys.sleep(5)
<- Sys.time()
fin difftime(time1 = fin, time2 = debut,units = "secs")
## Time difference of 5.11118 secs
9.3 Testez vos connaissances !
Testez vos connaissances sur ce chapitre avec ce quiz (10 min) en cliquant ici.