#Introduction Ce document présente les exercices de manipulation de chaînes de caractères en utilisant principalement les packages stringr, tidyr et tidytext.
##1. Transformations de base Dans cette section, nous créons une table de données et appliquons des transformations de casse.
# Création de la table
data_textuelle <- tibble(
nom = c("Mr Eric Legrand", "Mme Anabelle Dupont", "Mme Fatou Slaoui"),
adresse = c("12 rue Archimède", "47 avenue de la Libération", "3 rue des Fleurs"),
ville = c("Niort", "Poitiers", "Marseille")
)
# Exercices 1 à 3 : Transformations et concaténations
resultats_transfo <- data_textuelle %>%
mutate(
nom_MAJ = str_to_upper(nom),
adresse_min = str_to_lower(adresse),
ville_Capital = str_to_title(ville),
adresse_complete = str_c(adresse, " ", str_to_upper(ville)),
info_totale = str_c(nom, adresse, ville, sep = " - ")
)
knitr::kable(resultats_transfo)
| nom | adresse | ville | nom_MAJ | adresse_min | ville_Capital | adresse_complete | info_totale |
|---|---|---|---|---|---|---|---|
| Mr Eric Legrand | 12 rue Archimède | Niort | MR ERIC LEGRAND | 12 rue archimède | Niort | 12 rue Archimède NIORT | Mr Eric Legrand - 12 rue Archimède - Niort |
| Mme Anabelle Dupont | 47 avenue de la Libération | Poitiers | MME ANABELLE DUPONT | 47 avenue de la libération | Poitiers | 47 avenue de la Libération POITIERS | Mme Anabelle Dupont - 47 avenue de la Libération - Poitiers |
| Mme Fatou Slaoui | 3 rue des Fleurs | Marseille | MME FATOU SLAOUI | 3 rue des fleurs | Marseille | 3 rue des Fleurs MARSEILLE | Mme Fatou Slaoui - 3 rue des Fleurs - Marseille |
##2. Découpage et Séparation Ici, nous explorons comment scinder des colonnes complexes en plusieurs variables.
# Exercice 4 : Découpage avec str_split
data_ex4 <- data_textuelle %>%
mutate(concatene = str_c(nom, adresse, ville, sep = '|'))
# Extraction du premier élément de la liste pour démonstration
decoupage_exemple <- str_split(data_ex4$concatene, "\\|")[[1]]
print(decoupage_exemple)
## [1] "Mr Eric Legrand" "12 rue Archimède" "Niort"
# Exercice 5 : Séparation de colonnes avec separate()
# Note : Correction du séparateur (espace)
data_separee <- data_textuelle %>%
separate(
col = nom,
into = c("genre", "prenom", "nom_de_famille"),
sep = " "
)
knitr::kable(data_separee)
| genre | prenom | nom_de_famille | adresse | ville |
|---|---|---|---|---|
| Mr | Eric | Legrand | 12 rue Archimède | Niort |
| Mme | Anabelle | Dupont | 47 avenue de la Libération | Poitiers |
| Mme | Fatou | Slaoui | 3 rue des Fleurs | Marseille |
##3. Analyse de texte (NLP) Utilisation de tidytext pour le nettoyage et l’analyse fréquentielle
corpus <- tibble(
id = 1:3,
texte = c(
"La data science est un domaine interdisciplinaire.",
"Le text mining permet d'analyser des documents.",
"Les ingénieurs utilisent R et Python pour le NLP."
)
)
# Nettoyage manuel (Exercice 7)
corpus_nettoye <- corpus %>%
mutate(
texte_lower = str_to_lower(texte),
# Correction de [:punch] en [:punct:] et [:digit] en [:digit:]
texte_propre = str_replace_all(texte_lower, "[[:punct:]]", " "),
texte_final = str_remove_all(texte_propre, "[[:digit:]]")
)
# Tokenisation automatique (Exercice 8 & 9)
alice_text <- "Tom was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do : once or twice he had peeped into the book his sister was reading, but it had no pictures or conversations in it, 'and what is the use of a book,' thought Alice 'without pictures or conversation?'"
resultats_alice <- tibble(texte = alice_text) %>%
unnest_tokens(word, texte) %>%
count(word, sort = TRUE) %>%
mutate(probabilite = n / sum(n))
knitr::kable(head(resultats_alice, 5))
| word | n | probabilite |
|---|---|---|
| of | 3 | 0.0526316 |
| or | 3 | 0.0526316 |
| the | 3 | 0.0526316 |
| and | 2 | 0.0350877 |
| book | 2 | 0.0350877 |
Observation : Les mots les plus fréquents sont des mots de liaison (stop words), ce qui est typique en analyse textuelle.
##4. Recherche et Extraction (Regex) Utilisation des expressions régulières pour filtrer et extraire des motifs
# Exercice 10 à 12
data_recherche <- data_textuelle %>%
mutate(
contient_liberation = str_detect(adresse, "Libération"),
numero_rue = str_extract(adresse, "\\d+"),
nom_corrige = str_replace(nom, "Mr", "M."),
adresse_norm = str_replace_all(adresse, c("rue" = "RUE", "avenue" = "Avenue"))
)
knitr::kable(data_recherche)
| nom | adresse | ville | contient_liberation | numero_rue | nom_corrige | adresse_norm |
|---|---|---|---|---|---|---|
| Mr Eric Legrand | 12 rue Archimède | Niort | FALSE | 12 | M. Eric Legrand | 12 RUE Archimède |
| Mme Anabelle Dupont | 47 avenue de la Libération | Poitiers | TRUE | 47 | Mme Anabelle Dupont | 47 Avenue de la Libération |
| Mme Fatou Slaoui | 3 rue des Fleurs | Marseille | FALSE | 3 | Mme Fatou Slaoui | 3 RUE des Fleurs |
##5. Nettoyage de données monétaires Gestion des caractères spéciaux et conversion de types.
donnees_argent <- tibble(
Id = 1:4,
Montant = c("10$", "20$", "40$", "50$")
)
# Nettoyage et calcul de la moyenne
donnees_finales <- donnees_argent %>%
mutate(
prix_numerique = as.numeric(str_replace(Montant, "\\$", ""))
)
moyenne_prix <- mean(donnees_finales$prix_numerique)
La moyenne des montants est de r moyenne_prix.
##6. Application sur données réelles (Flights) Analyse des délais sur le dataset nycflights13.
library(nycflights13)
flights_analyse <- flights %>%
select(dep_delay, carrier, flight) %>%
drop_na(dep_delay) %>%
mutate(
delay_text = as.character(dep_delay),
retard_dep = !str_detect(delay_text, "^-") & dep_delay != 0,
on_time = str_detect(delay_text, "^0$"),
retard_extreme = dep_delay >= 60
)
head(flights_analyse) %>% knitr::kable()
| dep_delay | carrier | flight | delay_text | retard_dep | on_time | retard_extreme |
|---|---|---|---|---|---|---|
| 2 | UA | 1545 | 2 | TRUE | FALSE | FALSE |
| 4 | UA | 1714 | 4 | TRUE | FALSE | FALSE |
| 2 | AA | 1141 | 2 | TRUE | FALSE | FALSE |
| -1 | B6 | 725 | -1 | FALSE | FALSE | FALSE |
| -6 | DL | 461 | -6 | FALSE | FALSE | FALSE |
| -4 | UA | 1696 | -4 | FALSE | FALSE | FALSE |