R Select(), Filter(), Arrange(), Pipeline avec exemple
โก Rรฉsumรฉ intelligent
En R, les fonctions `select`, `filter` et `arrange` de la bibliothรจque dplyr permettent de rรฉduire un dataframe aux colonnes, lignes et ร l'ordre souhaitรฉs. Ce tutoriel les combine avec l'opรฉrateur `pipe` sur un jeu de donnรฉes de 205 lignes reprรฉsentant les temps de trajet.

Qu'est-ce que dplyr en R ?
dรฉplyr est le module de manipulation de donnรฉes du tidyverse. Il remplace la notation par crochets de base R avec un petit ensemble de verbes, chacun portant le nom de l'action qu'il effectue et prenant le cadre de donnรฉes comme premier argument. Cette structure cohรฉrente permet d'enchaรฎner les verbes.
| Verbe | Actes sur | Ce qu'il fait |
|---|---|---|
| sรฉlectionner() | Colonnes | Conserve ou supprime les variables |
| filtre() | rangรฉes | Conserve les lignes correspondant ร une condition |
| organiser() | rangรฉes | Rรฉorganise les lignes selon une ou plusieurs colonnes |
| subir une mutation() | Colonnes | Crรฉe ou modifie une variable |
| rรฉsumer() | Table entiรจre | Regroupe plusieurs lignes en une seule statistique |
| groupe_par() | Table entiรจre | Rรฉpartit les donnรฉes afin que les verbes suivants s'exรฉcutent par groupe. |
Ce tutoriel couvre les trois premiers verbes ainsi que le verbe ยซ pipe ยป. Tutoriel sur les fonctions d'agrรฉgation Couvre en dรฉtail les fonctions group_by() et summarise().
Jeu de donnรฉes utilisรฉ dans ce tutoriel
La bibliothรจque dplyr contient des verbes utiles pour naviguer dans le jeu de donnรฉes. Dans ce tutoriel, vous utiliserez le jeu de donnรฉes ยซ Travel times ยป. Ce jeu de donnรฉes enregistre les trajets effectuรฉs par un conducteur entre son domicile et son lieu de travail. Il comporte quatorze variables, dont :
- DayOfWeek : identifiez le jour de la semaine oรน le conducteur utilise sa voiture
- Distance : La distance totale du trajet
- MaxSpeed : La vitesse maximale du trajet
- TotalTime : La durรฉe en minutes du trajet
L'ensemble de donnรฉes contient 205 observations, et les trajets ont eu lieu ร partir de Monday jusqu'ร vendredi.
Tout d'abord, vous devez :
- charger l'ensemble de donnรฉes
- vรฉrifier la structure des donnรฉes.
La fonction glimpse() de dplyr est trรจs pratique. Elle remplit la mรชme fonction que str() de base en R, mais affiche une ligne par variable avec son type et ses premiรจres valeurs, ce qui facilite grandement la lecture d'un grand ensemble de donnรฉes.
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv" df <- read.csv(PATH) glimpse(df)
Sortie :
## Observations: 205 ## Variables: 14 ## $ X <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ... ## $ Date <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20... ## $ StartTime <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3... ## $ DayOfWeek <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,... ## $ GoingTo <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS... ## $ Distance <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37... ## $ MaxSpeed <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2... ## $ AvgSpeed <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,... ## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,... ## $ FuelEconomy <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89... ## $ TotalTime <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,... ## $ MovingTime <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,... ## $ Take407All <fctr> No, No, No, No, No, No, No, No, No, No, No, No... ## $ Comments <fctr> , , , , , , , , , , , , , , , Put snow tires o...
La variable ยซ Commentaires ยป mรฉrite clairement un examen plus approfondi : les premiรจres observations sont toutes vides.
sum(df$Comments =="")
Code Explication
- sum(df$Comments == ""): Compte les observations รฉgales ร une chaรฎne vide dans la colonne Comments de df
Sortie :
## [1] 181
Une fois les donnรฉes chargรฉes, commencez par le verbe qui supprime les colonnes.
sรฉlectionner()
Nous commencerons par le verbe select(). Nous n'avons pas nรฉcessairement besoin de toutes les variables, et une bonne pratique consiste ร sรฉlectionner uniquement les variables que vous jugez pertinentes.
Nous avons 181 observations manquantes, soit prรจs de 90 % de l'ensemble de donnรฉes. Si vous dรฉcidez de les exclure, vous ne pourrez pas poursuivre l'analyse.
L'autre possibilitรฉ est de supprimer la variable Comment avec le verbe select().
Nous pouvons sรฉlectionner des variables de diffรฉrentes maniรจres avec select(). Notez que le premier argument est lโensemble de donnรฉes.
- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset. - `select(df, A:C)`: Select all variables from A to C from df dataset. - `select(df, -C)`: Exclude C from the dataset from df dataset.
Vous pouvez utiliser la troisiรจme mรฉthode pour exclure la variable Commentaires.
step_1_df <- select(df, -Comments) dim(df)
Sortie :
## [1] 205 14
dim(step_1_df)
Sortie :
## [1] 205 13
L'ensemble de donnรฉes d'origine comporte 14 fonctionnalitรฉs tandis que step_1_df en contient 13.
Fonctions auxiliaires select() en R
Nommer chaque colonne devient impraticable dรจs qu'un jeu de donnรฉes comporte des dizaines de variables. dplyr propose des fonctions utilitaires permettant de sรฉlectionner les colonnes par motif ou par type.
| Auxiliaire | Sรฉlectionne les colonnes qui | Exemple |
|---|---|---|
| commence_avec() | Commencez par une ficelle | sรฉlectionner(df, commence_par("Moyenne")) |
| se termine par() | Terminez par une chaรฎne de caractรจres | sรฉlectionner(df, se termine par("Heure")) |
| contient() | Contenir une chaรฎne de caractรจres n'importe oรน | sรฉlectionner(df, contient("Vitesse")) |
| allumettes() | Correspond ร une expression rรฉguliรจre | sรฉlectionner(df, correspond("^Max|^Moyenne")) |
| oรน() | Rรฉussir un test de type | sรฉlectionner(df, oรน(est.numรฉrique)) |
| tout() | N'ont pas encore รฉtรฉ nommรฉs | sรฉlectionner(df, TotalTime, tout()) |
# Keep only the timing columns df %>% select(ends_with("Time")) # Keep every numeric column df %>% select(where(is.numeric)) # Move TotalTime to the front, keep the rest in place df %>% select(TotalTime, everything())
Deux autres verbes s'associent naturellement ร select(). Utilisez rename(new_name = old_name) pour renommer une colonne sans la supprimer.ping les autres, et relocate() pour dรฉplacer les colonnes sans toutes les lister.
filtre()
La fonction `filter()` conserve les observations qui satisfont une condition. Son fonctionnement est identique ร celui de `select()` : vous lui passez dโabord le dataframe, puis une condition, sรฉparรฉs par une virgule.
filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition: Condition used to filter the data
Un critรจre
Tout dโabord, vous pouvez compter le nombre dโobservations au sein de chaque niveau dโune variable factorielle.
table(step_1_df$GoingTo)
Code Explication
- table() : Compte le nombre d'observations par niveau. Elle attend une variable de type facteur ou caractรจre.
- table(step_1_df$GoingTo): Compte le nombre de trajets vers chaque destination
Sortie :
## ## GSK Home ## 105 100
La fonction table() indique que 105 trajets vont ร GSK et 100 ร Home.
Nous pouvons filtrer les donnรฉes pour renvoyer un ensemble de donnรฉes avec 105 observations et un autre avec 100 observations.
# Select observations where GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Sortie :
## [1] 100 14
# Select observations where GoingTo == GSK (work) select_work <- filter(df, GoingTo == "GSK") dim(select_work)
Sortie :
## [1] 105 14
Critรจres multiples
Nous pouvons filtrer un ensemble de donnรฉes ร l'aide de plusieurs critรจres. Par exemple, vous pouvezโฆtracdans les observations oรน la destination est le domicile et le voyage a eu lieu un mercredi.
select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday") dim(select_home_wed)
Sortie :
## [1] 23 14
23 observations correspondaient ร ce critรจre.
Conditions communes de filter() et Operators en R
La fonction filter() conserve toutes les lignes pour lesquelles la condition est vraie. Les lignes pour lesquelles la valeur est NA sont supprimรฉes, ce qui surprend souvent les dรฉbutants.
| Opรฉrateur | Sens | Exemple |
|---|---|---|
| == | รgal ร | filtrer(df, GoingTo == ยซ Home ยป) |
| != | Pas รฉgal ร | filtre(df, JourDeLaSemaine != ยซMondayยป) |
| & | ET, les deux doivent tenir | filtre(df, Distance > 50 & MaxSpeed โโ> 130) |
| | | OU, l'un ou l'autre peut dรฉtenir | filtre(df, JourDeLaSemaine == ยซMondayยซ | JourDeLaSemaine == ยซ Vendredi ยป ยป |
| %dans% | Correspond ร n'importe quelle valeur d'un vecteur | filtre(df, JourDeLaSemaine %dans% c("Monday", "Vendredi")) |
| entre() | Se situe dans une plage numรฉrique | filtrer(df, entre(Distance, 48, 52)) |
| est.na() | Valeur manquante | filtrer(df, est.na(รconomie de carburant)) |
Trois habitudes permettent d'รฉviter la plupart des bugs de la fonction filter().
- Utilisez %in% au lieu de OU chaรฎnรฉ. filtre(df, JourDeLaSemaine %dans% c("Mondayยซ ยป, ยซ vendredi ยป)) est plus court et beaucoup plus difficile ร mal taper que deux comparaisons == reliรฉes par une barre verticale.
- Ne jamais tester une valeur manquante avec ==. L'expression x == NA renvoie NA et non TRUE ; la ligne est donc ignorรฉe. Utilisez plutรดt is.na(x).
- La virgule signifie ET. filter(df, a, b) est identique ร filter(df, a & b), c'est pourquoi l'exemple donnรฉ plus tรดt dans ce tutoriel fonctionne dans les deux sens.
Le tuyau Operator dans dplyr
La crรฉation d'un jeu de donnรฉes nรฉcessite de nombreuses opรฉrations, telles que :
- l'importation
- fusion
- la sรฉlection
- filtration
- etc
La bibliothรจque dplyr est livrรฉe avec un opรฉrateur pratique, %>%, appelรฉ pipeCela rend la manipulation des donnรฉes plus propre, plus rapide et moins sujette aux erreurs.
Cet opรฉrateur est un code qui effectue des รฉtapes sans enregistrer les รฉtapes intermรฉdiaires sur le disque dur. Si vous revenez ร notre exemple ci-dessus, vous pouvez sรฉlectionner les variables qui vous intรฉressent et les filtrer. Nous avons trois รฉtapes :
- รtape 1 : Importer les donnรฉes : Importez les donnรฉes GPS
- รtape 2 : Sรฉlectionnez les donnรฉes : sรฉlectionnez GoingTo et DayOfWeek
- รtape 3 : Filtrer les donnรฉes : retour uniquement ร la maison et le mercredi
Nous pouvons utiliser la mรฉthode dure pour le faire :
# Step 1 step_1 <- read.csv(PATH) # Step 2 step_2 <- select(step_1, GoingTo, DayOfWeek) # Step 3 step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday") head(step_3)
Sortie :
## GoingTo DayOfWeek ## 1 Home Wednesday ## 2 Home Wednesday ## 3 Home Wednesday ## 4 Home Wednesday ## 5 Home Wednesday ## 6 Home Wednesday
Ce n'est pas une mรฉthode pratique pour enchaรฎner de nombreuses opรฉrations. Chaque rรฉsultat intermรฉdiaire reste dans l'environnement, et les noms finissent par perdre tout leur sens.
Utilisez plutรดt l'opรฉrateur pipe %>%. Vous nommez le cadre de donnรฉes une seule fois au dรฉbut, et chaque รฉtape en dรฉcoule.
Syntaxe de base du pipeline
New_df <- df %>% step 1 %>% step 2 %>% ... arguments - New_df: Name of the new data frame - df: Data frame used to compute the step - step: Instruction for each step - Note: the last instruction does not need a trailing `%>%`, because nothing follows it - Note: assigning the result to a new object is optional. Without it, the output prints in the console.
Vous pouvez crรฉer votre premier canal en suivant les รฉtapes รฉnumรฉrรฉes ci-dessus.
# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline filter_home_wed <- #Step 1 read.csv(PATH) %>% #Step 2 select(GoingTo, DayOfWeek) %>% #Step 3 filter(GoingTo == "Home",DayOfWeek == "Wednesday") identical(step_3, filter_home_wed)
Sortie :
## [1] TRUE
Les deux objets รฉtant identiques, le pipeline a produit exactement le mรชme rรฉsultat dans une seule instruction lisible.
organiser()
Dans l' prรฉcรฉdent tutoriel, vous apprenez ร trier les valeurs avec la fonction sort(). La bibliothรจque dplyr a sa fonction de tri. Cela fonctionne ร merveille avec le pipeline. Le verbe arrange() peut rรฉorganiser une ou plusieurs lignes, soit par ordre croissant (par dรฉfaut), soit par ordre dรฉcroissant.
- `arrange(A)`: Ascending sort of variable A - `arrange(A, B)`: Ascending sort of variable A and B - `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B
Nous pouvons trier la distance par destination.
# Sort by destination and distance step_2_df <- step_1_df %>% arrange(GoingTo, Distance) head(step_2_df)
Sortie :
## X Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed ## 1 193 7/25/2011 08:06 Monday GSK 48.32 121.2 63.4 ## 2 196 7/21/2011 07:59 Thursday GSK 48.35 129.3 81.5 ## 3 198 7/20/2011 08:24 Wednesday GSK 48.50 125.8 75.7 ## 4 189 7/27/2011 08:15 Wednesday GSK 48.82 124.5 70.4 ## 5 95 10/11/2011 08:25 Tuesday GSK 48.94 130.8 85.7 ## 6 171 8/10/2011 08:13 Wednesday GSK 48.98 124.8 72.8 ## AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All ## 1 78.4 8.45 45.7 37.0 No ## 2 89.0 8.28 35.6 32.6 Yes ## 3 87.3 7.89 38.5 33.3 Yes ## 4 77.8 8.45 41.6 37.6 No ## 5 93.2 7.81 34.3 31.5 Yes ## 6 78.8 8.54 40.4 37.3 No
Verbes dplyr en R : Guide de rรฉfรฉrence rapide
Le tableau ci-dessous rรฉpertorie tous les verbes utilisรฉs dans ce tutoriel, avec leur syntaxe et la valeur de retour de chaque appel :
| Verbe | Objectif | Code | Explication |
|---|---|---|---|
| aperรงu | vรฉrifier la structure d'un df |
glimpse(df)
|
Mรชme fonction que str(), plus facile ร lire |
| sรฉlectionner() | Sรฉlectionner/exclure les variables |
select(df, A, B ,C)
|
Sรฉlectionnez les variables A, B et C |
select(df, A:C)
|
Sรฉlectionnez toutes les variables de A ร C | ||
select(df, -C)
|
Exclure C | ||
| filtre() | Conservez les lignes correspondant ร une ou plusieurs conditions |
filter(df, condition1)
|
Une condition |
filter(df, condition1 & condition2)
|
Deux conditions combinรฉes par ET | ||
| organiser() | Trier l'ensemble de donnรฉes avec une ou plusieurs variables |
arrange(A)
|
Tri ascendant de la variable A |
arrange(A, B)
|
Tri ascendant des variables A et B | ||
arrange(desc(A), B)
|
Tri dรฉcroissant de la variable A et tri ascendant de B | ||
| %>% | Crรฉer un pipeline entre chaque รฉtape |
step 1 %>% step 2 %>% step 3 |
