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 |

