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 :