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 |