R Select(), Filter(), Arrange(), Pipeline avec exemple

La bibliothèque appelée dplyr contient des verbes précieux pour naviguer dans l'ensemble de données. Grâce à ce tutoriel, vous utiliserez le jeu de données Temps de trajet. L'ensemble de données collecte des informations sur le trajet effectué par un conducteur entre son domicile et son lieu de travail. Il y a quatorze variables dans l'ensemble de données, 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 environ 200 observations, et les trajets ont eu lieu entre Monday jusqu'à vendredi.

Tout d'abord, vous devez :

  • charger l'ensemble de données
  • vérifier la structure des données.

Une fonctionnalité pratique de dplyr est la fonction glimpse(). Il s'agit d'une amélioration par rapport à str(). Nous pouvons utiliser glimpse() pour voir la structure de l'ensemble de données et décider quelle manipulation est requise.

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...	

Il est évident que la variable Commentaires nécessite un diagnostic plus approfondi. Les premières observations de la variable Commentaires ne sont que des valeurs manquantes.

sum(df$Comments =="")

Explication du code

  • sum(df$Comments =="") : somme les observations égales à "" dans la colonne commentaires de df

Sortie :

## [1] 181

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.

Filtre()

Le verbe filter() permet de maintenir les observations selon un critère. Le filter() fonctionne exactement comme select(), vous transmettez d'abord la trame de données puis une condition séparée 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)

Explication du code

  • table() : Comptez le nombre d'observations par niveau. Notez que seules les variables au niveau du facteur sont acceptées
  • table(step_1_df$GoingTo) : comptez le nombre de voyages vers la destination finale.

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
if GoingTo == Home
select_home <- filter(df, GoingTo == "Home")
dim(select_home)

Sortie :

## [1] 100  14
# Select observations
if GoingTo == Work
select_work <- filter(df, GoingTo == "GSK")
dim(select_work)

Sortie :

## [1] 105  14

Plusieurs critères

Nous pouvons filtrer un ensemble de données avec plusieurs critères. Par exemple, vous pouvez extraire les observations dont la destination est Domicile et qui ont 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.

Pipeline

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é pipeline. La fonctionnalité de pipeline rend la manipulation propre, rapide et moins propice 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 manière pratique d’effectuer de nombreuses opérations, surtout dans une situation comportant de nombreuses étapes. L'environnement se retrouve avec beaucoup d'objets stockés.

Utilisons plutôt l'opérateur de pipeline %>%. Il suffit de définir la trame de données utilisée au début et tout le processus en découlera.

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 the pipe operator `%`, you don't have instructions to pipe anymore
Note: Create a new variable is optional. If not included, the output will be displayed 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

Nous sommes prêts à créer un superbe ensemble de données avec l'opérateur du pipeline.

organiser()

Dans le 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

Résumé

Dans le tableau ci-dessous, vous résumez toutes les opérations que vous avez apprises au cours du didacticiel.

Verbe Objectif Code Explication
aperçu vérifier la structure d'un df
glimpse(df)
Identique à str()
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() Filtrer le df en fonction d'une ou plusieurs conditions
filter(df, condition1)
Une condition
filter(df, condition1
condition2)
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