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.

  • ๐Ÿ“‹ Sรฉlection de colonne : select(df, A, B) conserve les colonnes nommรฉes, select(df, A:C) conserve une plage et select(df, -C) en supprime une.
  • ???? Filtrage des lignes : filter(df, condition) conserve les lignes correspondantes, et les conditions se combinent avec l'esperluette pour ET ou la barre verticale pour OU.
  • ๐Ÿ”ฃ Tri: La fonction arrange() trie les lignes par ordre croissant par dรฉfaut, et la fonction desc() inverse l'ordre de n'importe quelle colonne.
  • ๐Ÿ”— Taille du tuyau Operator: L'opรฉrateur %>% transmet chaque rรฉsultat directement au verbe suivant, รฉvitant ainsi d'encombrer l'environnement avec des objets intermรฉdiaires.
  • ๐Ÿงน Fonctions auxiliaires : Les fonctions starts_with(), contains() et where() sรฉlectionnent les colonnes par modรจle ou par type plutรดt que par nom.
  • (I.e. L'ordre des verbes est important : Filtrer les donnรฉes au dรฉbut pour les rรฉduire, puis les sรฉlectionner, puis les organiser, ce qui permet de rรฉduire le coรปt de chaque รฉtape ultรฉrieure.

R Sรฉlectionner Filtrer Organiser le pipeline

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

FAQ

Le pipe `magrittr %>%` est fourni avec dplyr et prend en charge la syntaxe des espaces rรฉservรฉs avec un point. Le pipe natif `|>` est apparu dans R 4.1 et ne nรฉcessite aucun package. Les deux transmettent le rรฉsultat de la premiรจre instruction ร  droite comme premier argument.

Non. Chaque commande dplyr renvoie un nouveau cadre de donnรฉes et laisse l'entrรฉe intacte. Pour que la modification soit prise en compte, vous devez affecter le rรฉsultat ร  un objet ou le transmettre ร  une autre fonction.

Une comparaison avec NA renvoie NA au lieu de TRUE, et la fonction filter() ne conserve que les lignes pour lesquelles TRUE est vrai. Utilisez is.na() pour sรฉlectionner dรฉlibรฉrรฉment les valeurs manquantes, ou drop_na() de tidyr pour les supprimer.

L'ingรฉnierie des caractรฉristiques pour les modรจles d'IA consiste principalement ร  filtrer les lignes, sรฉlectionner les colonnes et trier les donnรฉes. dplyr formalise ces รฉtapes sous forme de pipelines lisibles et vรฉrifiables par les relecteurs, ce qui est essentiel pour garantir la reproductibilitรฉ d'un jeu de donnรฉes d'entraรฎnement.

Oui. Les assistants IA peuvent traduire la sรฉlection par crochets en appels `select()` et `filter()` et expliquer le fonctionnement du pipe. Il est toujours recommandรฉ d'exรฉcuter les deux versions et de comparer les dimensions, car R de base et dplyr traitent diffรฉremment les valeurs manquantes.

Rรฉsumez cet article avec :