# Bulletin de la Dialyse à Domicile

## Initiation à la manipulation de données avec le package dplyr

Claire Della Vedova

1087 chemin de Sainte Roustagne, 04100 MANOSQUE, France

### Résumé

NDLR : Le RDPLF a pour but principal d'être une aide pour permettre aux équipes de dialyse à domicile d'évaluer leurs pratiques cliniques et également conduire des études à partir d'exports anonymisés des données qu'elles saisissent. A cette fin, depuis juin 2019, un article de formation à l'utilisation du logiciel Libre R est publié trimestriellement à chaque parution du Bulletin de la Dialyse à Domicile. Le but est de permettre à toutes les équipes de réaliser des statistiques de bases et visualiser rapidement leur données.

Le premier article de cette série d'initiation était consacré au téléchargement et à l'installation du logiciel R sur les ordinateurs Macintosh et PC : https://doi.org/10.25796/bdd.v2i2.20513.

Le second article était consacré à la visualisation graphiques des données statistiques avec le package Esquisse, simple d'utilisation et nécessitant peu d'apprentissage : https://doi.org/10.25796/bdd.v2i3.21313.

Le troisième article était consacré à la visualisation graphiques avec le Package ggplot2 :

La formation totale se fait sur 15 mois, au rythme d'un article par trimestre à chaque parution du BDD. Cela laissera largement le temps d'assimiler et tester les connaissances acquises entre chaque article. Pour ceux qui souhaiteront aller plus vite, ils pourront aller sur le blog (https://statistique-et-logiciel-r.com/).

Dates des prochaines parutions :

- article 6 (Septembre 2020) : la réalisation d'analyses descriptives (paramètres statistiques et graphs) sous forme de dashboard avec le package flexboard

Mots clés : Statistiques, épidemiologie, RDPLF, Logiciel libre R, cours de statistiques

https://doi.org/10.25796/bdd.v2i4.52303

Le quatrième article expliquait comment générer un rapport d'analyse automatiquement, et de façon dynamique, en utilisant "R markdown".

Ce cinquième article est consacré à la manipulation des données avec le package dplyr : https://doi.org/10.25796/bdd.v3i1.54523

Comme dans les numéros précédent un fichier exemple, tiré de la base de données du RDPLF sera utlisé.

Claire Della Vedova est Ingénieure en biostatistique / data analyste, Elle utilise quotidiennement le logiciel R pour analyser des données. Elle a travaillé pendant plus de 15 ans dans les domaines de l'environnement et de la santé, et a formé de nombreux étudiants et chercheurs à l'utilisation de R. Elle anime depuis novembre 2017 le blog Statistique et Logiciel R dont le but est d'aider les débutants à mieux appréhender les méthodes statistiques classiques et à utiliser le logiciel R plus efficacement, notamment au travers de tutoriels : https://statistique-et-logiciel-r.com/.
# 1. Introduction

L'analyse de données nécessite bien souvent de savoir manipuler des tableaux de données, par exemple pour sélectionner des colonnes, filtrer des lignes, ou encore calculer des paramètres sur un sous-groupe d'observations.

Sous R, toutes ces manipulations peuvent facilement être réalisées, en employant le package dplyr (qui appartient, comme le package ggplot2, au super package tidyverse).

Les principales fonctions à connaître, pour débuter dans la manipulation de données sont :

* select() : pour sélectionner des colonnes,

* filter() : pour sélectionner des lignes,

* mutate() : pour créer des variables,

* summarise() : pour résumer des données, en calculant des paramètres descriptifs,

* group_by() : pour regrouper les données (avant de calculer un paramètre descriptif par exemple).

Ces cinq fonctions peuvent s'utiliser les unes après les autres, en utilisant le symbole %>% (pipe en anglais), que l'on pourrait traduire par "et puis".

Nous allons les explorer une à une à travers quelques exemples.

Le package dispose d'une cheat sheet, elle peut être téléchargée à partir de R Studio et de l'onglet Help -> Cheatsheets -> Data Transformation with dplyr.

<figure><img src="image_1.png" /></figure>
Data Transformation with dplyr : : CHEAT SHEET

dplyr functions work with pipes and expect tidy data. In tidy data:

<figure><img src="image_2.png" /></figure>

Each variable is in
its own column

&

<figure><img src="image_3.png" /></figure>

Each observation, or
case, is in its own row

<figure><img src="image_4.png" /></figure>

pipes

x %>% f(y)
becomes f(x, y)

Summarise Cases

These apply summary functions to columns to create a new
table of summary statistics. Summary functions take vectors as
input and return one value (see back).

summary function

<figure><img src="image_5.png" /></figure>

summarise(data...)

Compute table of summaries.

summarise(mtcars, avg = mean(mpg))

count(x, ..., wt = NULL, sort = FALSE)

Count number of rows in each group defined
by the variables in ... Also tally().

count(iris, Species)

VARIATIONS

summarise_all() - Apply funs to every column.

summarise_at() - Apply funs to specific columns.

summarise_if() - Apply funs to all cols of one type.

Group Cases

Use group_by() to create a "grouped" copy of a table.
dplyr functions will manipulate each "group" separately and
then combine the results.

<figure><img src="image_6.png" /></figure>

mtcars %>%

group_by(cyl) %>%

summarise(average = mean(mpg))

group_by(data, ..., add = FALSE)

Returns copy of table
grouped by ...
g_iris <- group_by(iris, Species)

ungroup(x,...)

Returns ungrouped copy
of table.
ungroup(g_iris)

Manipulate Cases

EXTRACT CASES

Row functions return a subset of rows as a new table.

<figure><img src="image_7.png" /></figure>

filter(data,...) Extract rows that meet logical
criteria. filter(iris, Sepal.Length > 7)

<figure><img src="image_8.png" /></figure>

distinct(data, ..., keep_all = FALSE) Remove
rows with duplicate values.
distinct(iris, Species)

<figure><img src="image_9.png" /></figure>

sample_frag(tbl, size = 1, replace = FALSE,
weight = NULL, env = parent frame()) Randomly
select fraction of rows.
sample_frag(iris, 0.5, replace = TRUE)

<figure><img src="image_10.png" /></figure>

sample_n(tbl, size, replace = FALSE, weight = NULL, env = parent frame()) Randomly select size rows. sample_n(iris, 10, replace = TRUE)

<figure><img src="image_11.png" /></figure>

slice(data, ...) Select rows by position.
slice(iris, 10, 15)

top_n(x, n, wt) Select and order top n entries (by
column if grouped data). top_n(iris, 5, Sepal.Width)

Logical and boolean operators to use with filter()

< =
> >=

is.na() !
!is.na()

|

&

xor()

ARRANGE CASES

<figure><img src="image_12.png" /></figure>

arrange(data, ...) Order rows by values of a
column or columns (low to high), use with
desc() to order from high to low.
arrange(mtcars, mpg)
arrange(mtcars, desc(mpg))

ADD CASES

<figure><img src="image_13.png" /></figure>

add_row(data, ..., before = NULL, after = NULL)
Add one or more rows to a table.
add_row(faithful, eruptions = 1, waiting = 1)

add_row(faithful, eruptions = 1, waiting = 1)

Manipulate Variables

EXTRACT VARIABLES

Column functions return a set of columns as a new vector or table.

<figure><img src="image_14.png" /></figure>

pull(data, var = -1) Extract column values as
a vector. Choose by name or index.
pull(iris, Sepal.Length)

<figure><img src="image_15.png" /></figure>

select(data, ...)
Extract columns as a table. Also select_if().
select(iris, Sepal.Length, Species)

Use these helpers with select(),
e.g. select(iris, starts_with("Sepal"))

contains(match)

num_range(prefix, range)

; e.g. mpg:cyl

ends_with(match)

one_of(...)

; e.g., Species

matches(match)

starts_with(match)

MAKE NEW VARIABLES

These apply vectorized functions to columns. Vectorized funs take
vectors as input and return vectors of the same length as output
(see back).

vectorized function

<figure><img src="image_16.png" /></figure>

mutate(data, ...)
Compute new column(s).
mutate(mtcars, gpm = 1/mpg)

<figure><img src="image_17.png" /></figure>

transmute(data, ...)
Compute new column(s), drop others.
transmute(mtcars, gpm = 1/mpg)

<figure><img src="image_18.png" /></figure>

mutate_all(tbl, funs, ...) Apply funs to every
column. Use with funs(). Also mutate_if().
mutate_all(faithful, funs(log(.), log2(.))
mutate_if(iris, is.numeric, funs(log(.)))

<figure><img src="image_19.png" /></figure>

mutate_at(tbl, cols, funs, ...) Apply funs to
specific columns. Use with funs(), vars() and
the helper functions for select().
mutate_at(iris, vars(-Species), funs(log(.)))

<figure><img src="image_20.png" /></figure>

add_column(data, ..., before = NULL, after = NULL)
Add new column(s). Also add_count().
add_tally(). add_column(mtcars, new = 1:3)

<figure><img src="image_21.png" /></figure>

rename(data, ...) Rename columns.
rename(iris, Length = Sepal.Length)

2. Avant de commencer

2.1 Organiser son travail

Avant de commencer à explorer les fonctions du package dplyr je vous recommande de créer un dossier de travail dédié à votre analyse de données, et de l'associer à un projet R.

Vous trouverez plus d'information sur cette étape dans le premier article de cette série dédiée à l'utilisation du logiciel R https://www.bdd.rdplf.org/index.php/bdd/article/view/20513.

Les données utilisées dans les exemples ci-dessous, sont les mêmes que celles des articles précédents, elles sont téléchargeables au format csv, à cette adresse : https://www.rdplf.org/exempleR/FichierExempleStat.csv

Une fois téléchargé, placez le fichier csv dans le dossier "data" de votre projet R, puis utilisez la
commande suivante pour les importer dans R :

mydata <- read.csv2(«data/FichierExempleStat.csv»)
## 2.2 Charger le package dplyr

Pour charger le package dplyr, vous pouvez employer l'une des deux commandes suivantes :

```
library(dplyr)
```

```
library(tidyverse)
```

## 2.2 Gérer les éventuels conflits de packages

Un conflit de package peut survenir lorsque deux packages contiennent des fonctions différentes mais portant le même nom. C'est le cas, par exemple, de la fonction select() du package dplyr, et de la fonction select() du package MASS. En cas de conflits de packages, R ne sait pas quelle fonction choisir. Au mieux, il vous renverra une erreur dont le message est rarement intelligible, au pire, il ne fera rien : il n'exécutera pas la commande et vous ne le signalera pas !

Pour éviter cette situation, je vous recommande de spécifier, en amont de vos scripts, que vous souhaitez utiliser les fonctions select() et filter() du package dplyr, en utilisant le package conflicted et sa fonction conflict_prefer(), comme ceci :

```
library(conflicted)
```

```
conflict_prefer(«select», «dplyr»)
```

```
conflict_prefer(«filter», «dplyr»)
```

Remarque : à ma connaissance les fonctions mutate(), summarise() et group_by ne sont pas (actuellement) concernées par un éventuel conflit de package.

# 3. Selectionner des variables

Pour créer un sous-jeu de données en ne sélectionnant que certaines variables, nous employons la fonction select().

## 3.1 Par le nom

Si nous souhaitons faire un nouveau fichier de données, avec uniquement les variables PAYS, sexe, Charlson, Taille et Poids, il suffit de les indiquer en argument de la fonction select() :

```
mydata2 <- mydata %>%
```

```
select(PAYS, sexe, Charlson, Taille, Poids)
```

```
# vérification des variables présentes dans le jeu créé
head(mydata2)
```

```
## PAYS sexe Charlson Taille Poids
```

```
## 1 FRANCE F 3 132 30.0
```

```
## 2 TUNISIE F 3 131 32.5
```

```
## 3 LUXEMBOURG M 5 140 33.0
```

```
## 4 FRANCE F 6 142 35.0
```

```
## 5 FRANCE F 6 150 35.0
```

```
## 6 FRANCE F 4 145 37.0
```
3.2 Désélectionner le nom

Il est également possible de désélectionner des variables, en employant le symbole “-” devant
celles-ci :

mydata3 <- mydata %>%
  select(-code.post, -Age.lere.DP, -Charlson_modif, -Type.de.DP)

# verification

head(mydata3)

<table>
  <thead>
    <tr>
      <th>##</th>
      <th>PAYS</th>
      <th>sexe</th>
      <th>Charlson</th>
      <th>Taille</th>
      <th>Poids</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>## 1</td>
      <td>FRANCE</td>
      <td>F</td>
      <td>3</td>
      <td>132</td>
      <td>30.0</td>
    </tr>
    <tr>
      <td>## 2</td>
      <td>TUNISIE</td>
      <td>F</td>
      <td>3</td>
      <td>131</td>
      <td>32.5</td>
    </tr>
    <tr>
      <td>## 3</td>
      <td>LUXEMBOURG</td>
      <td>M</td>
      <td>5</td>
      <td>140</td>
      <td>33.0</td>
    </tr>
    <tr>
      <td>## 4</td>
      <td>FRANCE</td>
      <td>F</td>
      <td>6</td>
      <td>142</td>
      <td>35.0</td>
    </tr>
    <tr>
      <td>## 5</td>
      <td>FRANCE</td>
      <td>F</td>
      <td>6</td>
      <td>150</td>
      <td>35.0</td>
    </tr>
    <tr>
      <td>## 6</td>
      <td>FRANCE</td>
      <td>F</td>
      <td>4</td>
      <td>145</td>
      <td>37.0</td>
    </tr>
  </tbody>
</table>

3.3 Sélection par nom partiel

Il est encore possible de sélectionner des variables en utilisant un motif de lettres contenu dans
le nom des variables. Par exemple, si nous souhaitons sélectionner toutes les variables contenant
le motif "Charlson" :

mydata4 <- mydata %>%
  select(contains(«Charlson»))

# verification

head(mydata4)

## Charlson Charlson_modif

<table>
   <tr>
    <td>
     ## 1
    </td>
    <td>
     3
    </td>
    <td>
     3
    </td>
   </tr>
   <tr>
    <td>
     ## 2
    </td>
    <td>
     3
    </td>
    <td>
     2
    </td>
   </tr>
   <tr>
    <td>
     ## 3
    </td>
    <td>
     5
    </td>
    <td>
     5
    </td>
   </tr>
   <tr>
    <td>
     ## 4
    </td>
    <td>
     6
    </td>
    <td>
     5
    </td>
   </tr>
   <tr>
    <td>
     ## 5
    </td>
    <td>
     6
    </td>
    <td>
     5
    </td>
   </tr>
   <tr>
    <td>
     ## 6
    </td>
    <td>
     4
    </td>
    <td>
     3
    </td>
   </tr>
  </table>

Nous pouvons aussi employer les fonctions starts_with() et ends_with(). Par exemple, pour sélectionner les variables se terminant par le motif de lettres "DP" :

mydata5 <- mydata %>%
  select(ends_with(«DP»))

# vérification

head(mydata5)

<table>
  <thead>
    <tr>
      <th>##</th>
      <th>Age.lere.DP</th>
      <th>Type.de.DP</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>## 1</td>
      <td>20.13</td>
      <td>DPCA</td>
    </tr>
    <tr>
      <td>## 2</td>
      <td>50.74</td>
      <td>DPCA</td>
    </tr>
    <tr>
      <td>## 3</td>
      <td>18.86</td>
      <td>DPA quotidienne</td>
    </tr>
    <tr>
      <td>## 4</td>
      <td>50.86</td>
      <td>DPA quotidienne</td>
    </tr>
    <tr>
      <td>## 5</td>
      <td>54.07</td>
      <td>DPCA</td>
    </tr>
    <tr>
      <td>## 6</td>
      <td>53.89</td>
      <td>DPCA</td>
    </tr>
  </tbody>
</table>
## 3.4 Sélection par classe de variable

En complément de la fonction select(), le package dplyr dispose d'une fonction select_if() qui permet, par exemple de sélectionner des variables en fonction de leur classe (numérique ou factoriel).

Ainsi, si nous souhaitons, sélectionner toutes les variables numérique d'un data frame, nous pouvons employer la commande suivante :

```
mydata_num <- mydata %>%
  select_if(is.numeric)
```

```
head(mydata_num)
```

<table><thead><tr><th>##</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Taille</th><th>Poids</th></tr></thead><tbody><tr><td>## 1</td><td>20.13</td><td>3</td><td>3</td><td>132</td><td>30.0</td></tr><tr><td>## 2</td><td>50.74</td><td>3</td><td>2</td><td>131</td><td>32.5</td></tr><tr><td>## 3</td><td>18.86</td><td>5</td><td>5</td><td>140</td><td>33.0</td></tr><tr><td>## 4</td><td>50.86</td><td>6</td><td>5</td><td>142</td><td>35.0</td></tr><tr><td>## 5</td><td>54.07</td><td>6</td><td>5</td><td>150</td><td>35.0</td></tr><tr><td>## 6</td><td>53.89</td><td>4</td><td>3</td><td>145</td><td>37.0</td></tr></tbody></table>

De même pour les variables catégorielles :

```
mydata_fact <- mydata %>%
  select_if(is.factor)
```

```
head(mydata_fact)
```

<table><thead><tr><th>##</th><th>code.post</th><th>PAYS</th><th>sexe</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>## 1</td><td>56100</td><td>FRANCE</td><td>F</td><td>DPCA</td></tr><tr><td>## 2</td><td>1006</td><td>TUNISIE</td><td>F</td><td>DPCA</td></tr><tr><td>## 3</td><td>2540</td><td>LUXEMBOURG</td><td>M</td><td>DPA quotidienne</td></tr><tr><td>## 4</td><td>3200</td><td>FRANCE</td><td>F</td><td>DPA quotidienne</td></tr><tr><td>## 5</td><td>31603</td><td>FRANCE</td><td>F</td><td>DPCA</td></tr><tr><td>## 6</td><td>74374</td><td>FRANCE</td><td>F</td><td>DPCA</td></tr></tbody></table>

## 4. Filtrer des lignes

La fonction filter() permet de filtrer des lignes, notamment en fonction:

* d'une variable numérique

* d'une variable catégorielle (facteur)

### 4.1 En fonction d'une variable numérique

Par exemple, si nous souhaitons conserver uniquement les patients dont l'âge de la première DP est supérieur à 65 ans :
sup65 <-mydata %>%
  filter(Age.lere.DP>65)

head(sup65)

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>25000</td><td>FRANCE</td><td>F</td><td>86.50</td><td>7</td><td>3</td><td>DPCA</td></tr><tr><td>2</td><td>83100</td><td>FRANCE</td><td>F</td><td>83.75</td><td>7</td><td>3</td><td>DPCA</td></tr><tr><td>3</td><td>72037</td><td>FRANCE</td><td>F</td><td>71.58</td><td>7</td><td>4</td><td>DPA quotidienne</td></tr><tr><td>4</td><td>97448</td><td>FRANCE</td><td>F</td><td>76.88</td><td>5</td><td>2</td><td>DPA quotidienne</td></tr><tr><td>5</td><td>3200</td><td>FRANCE</td><td>F</td><td>69.25</td><td>4</td><td>2</td><td>DPCA</td></tr><tr><td>6</td><td>54504</td><td>FRANCE</td><td>F</td><td>86.53</td><td>7</td><td>3</td><td>DPCA</td></tr></tbody></table>

## Taille Poids

<table><tr><td>1</td><td>147</td><td>38</td></tr><tr><td>2</td><td>139</td><td>39</td></tr><tr><td>3</td><td>157</td><td>39</td></tr><tr><td>4</td><td>145</td><td>40</td></tr><tr><td>5</td><td>152</td><td>40</td></tr><tr><td>6</td><td>155</td><td>40</td></tr></table>

Nous pouvons également employer un intervalle de valeurs, comme ceci :

entre55_65 <- mydata %>%
  filter(between(Age.lere.DP, 55, 65))

head(entre55_65)

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>59037</td><td>FRANCE</td><td>F</td><td>56.06</td><td>3</td><td>2</td><td>DPCA</td></tr><tr><td>2</td><td>1200</td><td>BELGIQUE</td><td>F</td><td>63.29</td><td>8</td><td>6</td><td>DPA quotidienne</td></tr><tr><td>3</td><td>4500</td><td>BELGIQUE</td><td>F</td><td>57.30</td><td>4</td><td>3</td><td>DPA quotidienne</td></tr><tr><td>4</td><td>44402</td><td>FRANCE</td><td>F</td><td>58.72</td><td>6</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>5</td><td>31603</td><td>FRANCE</td><td>F</td><td>61.35</td><td>4</td><td>2</td><td>DPCA</td></tr><tr><td>6</td><td>29000</td><td>FRANCE</td><td>F</td><td>63.62</td><td>6</td><td>4</td><td>DPCA</td></tr></tbody></table>

## Taille Poids

<table><tr><td>1</td><td>135</td><td>42.0</td></tr><tr><td>2</td><td>157</td><td>43.0</td></tr><tr><td>3</td><td>167</td><td>43.0</td></tr><tr><td>4</td><td>162</td><td>44.0</td></tr><tr><td>5</td><td>145</td><td>44.5</td></tr><tr><td>6</td><td>157</td><td>45.0</td></tr></table>

## 4.2 En fonction d'une variable catégorielle

Si nous souhaitons réaliser un sous-jeu de données, ne contenant que les observations relatives à la France :
```
df_Fr <- mydata %>%
  filter(PAYS==»FRANCE»)
```

```
head(df_Fr)
```

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>56100</td><td>FRANCE</td><td>F</td><td>20.13</td><td>3</td><td>3</td><td>DPCA</td></tr><tr><td>2</td><td>3200</td><td>FRANCE</td><td>F</td><td>50.86</td><td>6</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>3</td><td>31603</td><td>FRANCE</td><td>F</td><td>54.07</td><td>6</td><td>5</td><td>DPCA</td></tr><tr><td>4</td><td>74374</td><td>FRANCE</td><td>F</td><td>53.89</td><td>4</td><td>3</td><td>DPCA</td></tr><tr><td>5</td><td>25000</td><td>FRANCE</td><td>F</td><td>86.50</td><td>7</td><td>3</td><td>DPCA</td></tr><tr><td>6</td><td>83100</td><td>FRANCE</td><td>F</td><td>83.75</td><td>7</td><td>3</td><td>DPCA</td></tr><tr><td colspan="8">Taille Poids</td></tr><tr><td>1</td><td>132</td><td></td><td>30</td><td></td><td></td><td></td><td></td></tr><tr><td>2</td><td>142</td><td></td><td>35</td><td></td><td></td><td></td><td></td></tr><tr><td>3</td><td>150</td><td></td><td>35</td><td></td><td></td><td></td><td></td></tr><tr><td>4</td><td>145</td><td></td><td>37</td><td></td><td></td><td></td><td></td></tr><tr><td>5</td><td>147</td><td></td><td>38</td><td></td><td></td><td></td><td></td></tr><tr><td>6</td><td>139</td><td></td><td>39</td><td></td><td></td><td></td><td></td></tr></tbody></table>

Pour sélectionner plusieurs pays, il est nécessaire de créer le vecteur de pays, et d'employer le symbole %in%, comme ceci :

```
df_Su_Be_Lu <- mydata %>%
  filter(PAYS %in% c( «SUISSE», «BELGIQUE», «LUXEMBOURG»))
```

```
head(df_Su_Be_Lu)
```

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>2540</td><td>LUXEMBOURG</td><td>M</td><td>18.86</td><td>5</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>2</td><td>1211</td><td>SUISSE</td><td>F</td><td>28.61</td><td>2</td><td>2</td><td>DPCA</td></tr><tr><td>3</td><td>1200</td><td>BELGIQUE</td><td>F</td><td>17.38</td><td>3</td><td>3</td><td>DPA quotidienne</td></tr><tr><td>4</td><td>1011</td><td>SUISSE</td><td>F</td><td>47.00</td><td>3</td><td>3</td><td>DPA quotidienne</td></tr><tr><td>5</td><td>1200</td><td>BELGIQUE</td><td>F</td><td>63.29</td><td>8</td><td>6</td><td>DPA quotidienne</td></tr><tr><td>6</td><td>1211</td><td>SUISSE</td><td>F</td><td>77.76</td><td>6</td><td>3</td><td>DPA quotidienne</td></tr><tr><td colspan="8">Taille Poids</td></tr><tr><td>1</td><td>140</td><td></td><td>33</td><td></td><td></td><td></td><td></td></tr><tr><td>2</td><td>154</td><td></td><td>41</td><td></td><td></td><td></td><td></td></tr><tr><td>3</td><td>147</td><td></td><td>42</td><td></td><td></td><td></td><td></td></tr><tr><td>4</td><td>150</td><td></td><td>43</td><td></td><td></td><td></td><td></td></tr><tr><td>5</td><td>157</td><td></td><td>43</td><td></td><td></td><td></td><td></td></tr><tr><td>6</td><td>157</td><td></td><td>43</td><td></td><td></td><td></td><td></td></tr></tbody></table>

### 4.3 En fonction d'un double critère.

Par exemple si nous souhaitons filtrer les femmes de plus de 170 cm
Fsup170 <- mydata %>%
  filter(sexe==»F») %>%
  filter(Taille>170)

head(Fsup170)

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>59385</td><td>FRANCE</td><td>F</td><td>64.90</td><td>4</td><td>2 DPA quotidienne</td></tr><tr><td>2</td><td>75020</td><td>FRANCE</td><td>F</td><td>20.73</td><td>2</td><td>2 DPA quotidienne</td></tr><tr><td>3</td><td>83100</td><td>FRANCE</td><td>F</td><td>58.74</td><td>15</td><td>14 DPA quotidienne</td></tr><tr><td>4</td><td>35400</td><td>FRANCE</td><td>F</td><td>77.03</td><td>7</td><td>4 DPCA</td></tr><tr><td>5</td><td>62408</td><td>FRANCE</td><td>F</td><td>46.60</td><td>3</td><td>3 DPCA</td></tr><tr><td>6</td><td>5000</td><td>TUNISIE</td><td>F</td><td>21.63</td><td>2</td><td>2 DPCA</td></tr></tbody></table>

## Taille Poids

<table><tr><td>1</td><td>175</td><td>45</td></tr><tr><td>2</td><td>172</td><td>48</td></tr><tr><td>3</td><td>172</td><td>52</td></tr><tr><td>4</td><td>172</td><td>54</td></tr><tr><td>5</td><td>171</td><td>56</td></tr><tr><td>6</td><td>171</td><td>58</td></tr></table>

A noter que nous pouvons également employer la syntaxe suivante :

Fsup170bis <- mydata %>%
  filter(sexe==»F» & Taille>170)

## 4.4 En fonction d'une position

Pour filtrer des lignes en fonction de leur position (index), nous pouvons employer la fonction `slice()`.

Par exemple, pour ne conserver que les lignes 5 à 10 du jeu de données :

mydata_5to10 <- mydata %>%
  slice(5:10)

mydata_5to10

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>31603</td><td>FRANCE</td><td>F</td><td>54.07</td><td>6</td><td>5 DPCA</td></tr><tr><td>2</td><td>74374</td><td>FRANCE</td><td>F</td><td>53.89</td><td>4</td><td>3 DPCA</td></tr><tr><td>3</td><td>20420</td><td>MAROC</td><td>F</td><td>22.25</td><td>2</td><td>2 DPCA</td></tr><tr><td>4</td><td>25000</td><td>FRANCE</td><td>F</td><td>86.50</td><td>7</td><td>3 DPCA</td></tr><tr><td>5</td><td>10000</td><td>MAROC</td><td>F</td><td>18.22</td><td>2</td><td>2 DPA quotidienne</td></tr><tr><td>6</td><td>83100</td><td>FRANCE</td><td>F</td><td>83.75</td><td>7</td><td>3 DPCA</td></tr></tbody></table>

## Taille Poids

<table><tr><td>1</td><td>150</td><td>35</td></tr><tr><td>2</td><td>145</td><td>37</td></tr><tr><td>3</td><td>148</td><td>37</td></tr><tr><td>4</td><td>147</td><td>38</td></tr><tr><td>5</td><td>136</td><td>39</td></tr><tr><td>6</td><td>139</td><td>39</td></tr></table>
Pour filtrer des lignes, non contiguës, en fonction de leur position, il est nécessaire d'employer la concaténation, comme dans l'exemple ci-dessous :

```
mydata_multiple <- mydata %>%
  slice(c(2:4),59,c(111:113))
```

```
mydata_multiple
```

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>1006</td><td>TUNISIE</td><td>F</td><td>50.74</td><td>3</td><td>2</td><td>DPCA</td></tr><tr><td>2</td><td>2540</td><td>LUXEMBOURG</td><td>M</td><td>18.86</td><td>5</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>3</td><td>3200</td><td>FRANCE</td><td>F</td><td>50.86</td><td>6</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>4</td><td>10000</td><td>MAROC</td><td>M</td><td>33.62</td><td>2</td><td>2</td><td>DPCA</td></tr><tr><td>5</td><td>1020</td><td>BELGIQUE</td><td>F</td><td>28.62</td><td>8</td><td>8</td><td>DPA quotidienne</td></tr><tr><td>6</td><td>75014</td><td>FRANCE</td><td>M</td><td>17.85</td><td>2</td><td>2</td><td>DPCA</td></tr><tr><td>7</td><td>46005</td><td>FRANCE</td><td>F</td><td>46.52</td><td>2</td><td>2</td><td>DPA quotidienne</td></tr></tbody></table><table><thead><tr><th>Taille</th><th>Poids</th></tr></thead><tbody><tr><td>1</td><td>131 32.5</td></tr><tr><td>2</td><td>140 33.0</td></tr><tr><td>3</td><td>142 35.0</td></tr><tr><td>4</td><td>159 44.0</td></tr><tr><td>5</td><td>165 46.0</td></tr><tr><td>6</td><td>165 46.0</td></tr><tr><td>7</td><td>168 46.0</td></tr></tbody></table>

## 4.5 Liste des principaux opérateurs

Les principaux opérateurs qui peuvent être employés avec la fonction filter() sont résumés ci-dessous :

<table><thead><tr><th>Opérateur</th><th>Signification</th></tr></thead><tbody><tr><td>&lt;</td><td>strictement inférieur</td></tr><tr><td>&lt;=</td><td>inférieur ou égal</td></tr><tr><td>&gt;</td><td>strictement supérieur</td></tr><tr><td>&gt;=</td><td>supérieur ou égal</td></tr><tr><td>==</td><td>exactement égal</td></tr><tr><td>!=</td><td>différent</td></tr><tr><td>xly</td><td>x et/ou y</td></tr><tr><td>xor(x,y)</td><td>x ou y (intersection exclue)</td></tr><tr><td>x & y</td><td>x et y</td></tr><tr><td>is.na(x)</td><td>test si x est NA</td></tr><tr><td>%in%</td><td>compris dans (un vecteur de choix)</td></tr></tbody></table>

## 5. Créer une nouvelle variable

La fonction mutate() permet de créer une nouvelle variable dans un data.frame.
## 5.1 Une variable numérique

Par exemple, si nous souhaitons créer une nouvelle variable taille, exprimée cette fois en mètres :

```
mydata <- mydata %>%
  mutate(Taille_m=Taille/100)
```

```
head(mydata)
```

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>56100</td><td>FRANCE</td><td>F</td><td>20.13</td><td>3</td><td>3</td><td>DPCA</td></tr><tr><td>2</td><td>1006</td><td>TUNISIE</td><td>F</td><td>50.74</td><td>3</td><td>2</td><td>DPCA</td></tr><tr><td>3</td><td>2540</td><td>LUXEMBOURG</td><td>M</td><td>18.86</td><td>5</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>4</td><td>3200</td><td>FRANCE</td><td>F</td><td>50.86</td><td>6</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>5</td><td>31603</td><td>FRANCE</td><td>F</td><td>54.07</td><td>6</td><td>5</td><td>DPCA</td></tr><tr><td>6</td><td>74374</td><td>FRANCE</td><td>F</td><td>53.89</td><td>4</td><td>3</td><td>DPCA</td></tr></tbody></table><table><thead><tr><th>Taille</th><th>Poids</th><th>Taille_m</th></tr></thead><tbody><tr><td>1</td><td>132</td><td>30.0</td><td>1.32</td></tr><tr><td>2</td><td>131</td><td>32.5</td><td>1.31</td></tr><tr><td>3</td><td>140</td><td>33.0</td><td>1.40</td></tr><tr><td>4</td><td>142</td><td>35.0</td><td>1.42</td></tr><tr><td>5</td><td>150</td><td>35.0</td><td>1.50</td></tr><tr><td>6</td><td>145</td><td>37.0</td><td>1.45</td></tr></tbody></table>

Si nous souhaitons, à présent, créer une variable IMC à partir du poids et de la taille des patients, en divisant le poids par la taille (exprimée en mètre) :

```
mydata <- mydata %>%
  mutate(IMC = Poids/(Taille_m))
```

```
head(mydata)
```

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>56100</td><td>FRANCE</td><td>F</td><td>20.13</td><td>3</td><td>3</td><td>DPCA</td></tr><tr><td>2</td><td>1006</td><td>TUNISIE</td><td>F</td><td>50.74</td><td>3</td><td>2</td><td>DPCA</td></tr><tr><td>3</td><td>2540</td><td>LUXEMBOURG</td><td>M</td><td>18.86</td><td>5</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>4</td><td>3200</td><td>FRANCE</td><td>F</td><td>50.86</td><td>6</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>5</td><td>31603</td><td>FRANCE</td><td>F</td><td>54.07</td><td>6</td><td>5</td><td>DPCA</td></tr><tr><td>6</td><td>74374</td><td>FRANCE</td><td>F</td><td>53.89</td><td>4</td><td>3</td><td>DPCA</td></tr></tbody></table><table><thead><tr><th>Taille</th><th>Poids</th><th>Taille_m</th><th>IMC</th></tr></thead><tbody><tr><td>1</td><td>132</td><td>30.0</td><td>1.32</td><td>22.72727</td></tr><tr><td>2</td><td>131</td><td>32.5</td><td>1.31</td><td>24.80916</td></tr><tr><td>3</td><td>140</td><td>33.0</td><td>1.40</td><td>23.57143</td></tr><tr><td>4</td><td>142</td><td>35.0</td><td>1.42</td><td>24.64789</td></tr><tr><td>5</td><td>150</td><td>35.0</td><td>1.50</td><td>23.33333</td></tr><tr><td>6</td><td>145</td><td>37.0</td><td>1.45</td><td>25.51724</td></tr></tbody></table>

## 5.2 Une variable catégorielle

En couplant la fonction ifelse(), à la fonction mutate(), il est par exemple possible de catégoriser une variable numérique. Cette fonction ifelse() prend trois arguments :

* la condition

* la valeur que prend la variable si la condition est satisfaite

* la valeur que prend la variable sinon.
Par exemple si nous souhaitons créer une variable "Stature" qui prend pour valeur "petite" si la taille est inférieure ou égale 166 cm, et "grande" sinon, nous pouvons employer les commandes suivantes :

mydata <- mydata %>%

mutate(Stature = ifelse(Taille<=166, «Petite», «Grande»))

# visualisation du résultat

sample_n(mydata,10)

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>38701</td><td>FRANCE</td><td>M</td><td>71.59</td><td>9</td><td>6</td><td>DPA quotidienne</td></tr><tr><td>2</td><td>11100</td><td>FRANCE</td><td>F</td><td>50.75</td><td>4</td><td>3</td><td>DPCA</td></tr><tr><td>3</td><td>13698</td><td>FRANCE</td><td>M</td><td>46.96</td><td>2</td><td>2</td><td>DPCA</td></tr><tr><td>4</td><td>84902</td><td>FRANCE</td><td>M</td><td>63.92</td><td>5</td><td>3</td><td>DPA quotidienne</td></tr><tr><td>5</td><td>62408</td><td>FRANCE</td><td>M</td><td>81.37</td><td>2</td><td>-2</td><td>DPCA</td></tr><tr><td>6</td><td>54504</td><td>FRANCE</td><td>M</td><td>78.86</td><td>6</td><td>3</td><td>DPCA</td></tr><tr><td>7</td><td>14033</td><td>FRANCE</td><td>F</td><td>68.18</td><td>5</td><td>3</td><td>DPCA</td></tr><tr><td>8</td><td>4000</td><td>TUNISIE</td><td>F</td><td>23.99</td><td>2</td><td>2</td><td>DPA quotidienne</td></tr><tr><td>9</td><td>94275</td><td>FRANCE</td><td>F</td><td>63.95</td><td>4</td><td>2</td><td>DPCA</td></tr><tr><td>10</td><td>4000</td><td>BELGIQUE</td><td>M</td><td>51.81</td><td>3</td><td>2</td><td>DPA quotidienne</td></tr></tbody></table><table><thead><tr><th>Taille</th><th>Poids</th><th>Taille_m</th><th>IMC</th><th>Stature</th></tr></thead><tbody><tr><td>175</td><td>86</td><td>1.75</td><td>49.14286</td><td>Grande</td></tr><tr><td>160</td><td>82</td><td>1.60</td><td>51.25000</td><td>Petite</td></tr><tr><td>170</td><td>87</td><td>1.70</td><td>51.17647</td><td>Grande</td></tr><tr><td>176</td><td>82</td><td>1.76</td><td>46.59091</td><td>Grande</td></tr><tr><td>172</td><td>87</td><td>1.72</td><td>50.58140</td><td>Grande</td></tr><tr><td>180</td><td>53</td><td>1.80</td><td>29.44444</td><td>Grande</td></tr><tr><td>148</td><td>53</td><td>1.48</td><td>35.81081</td><td>Petite</td></tr><tr><td>155</td><td>52</td><td>1.55</td><td>33.54839</td><td>Petite</td></tr><tr><td>165</td><td>106</td><td>1.65</td><td>64.24242</td><td>Petite</td></tr><tr><td>175</td><td>88</td><td>1.75</td><td>50.28571</td><td>Grande</td></tr></tbody></table>

## 5.3 Transformer une variable

La fonction mutate peut également permettre de modifier une variable existante, plutôt que d'en créer une autre. Pour cela, ce sont surtout les fonctions mutate_if() et mutate_at() qui sont employées.

Par exemple, pour centrer et réduire les variables numériques de notre jeu de données, nous pouvons coupler les fonctions mutate_if() et scale() qui permet le centrage réduction, comme ceci :

mydata_num_cr <- mydata %>%

mutate_if(is.numeric, scale)

head(mydata_num_cr)

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>56100</td><td>FRANCE</td><td>F</td><td>-2.7237972</td><td>-1.12386300</td><td>-0.3901693</td></tr><tr><td>2</td><td>1006</td><td>TUNISIE</td><td>F</td><td>-0.8685743</td><td>-1.12386300</td><td>-0.9416180</td></tr><tr><td>3</td><td>2540</td><td>LUXEMBOURG</td><td>M</td><td>-2.8007698</td><td>-0.33322084</td><td>0.7127281</td></tr><tr><td>4</td><td>3200</td><td>FRANCE</td><td>F</td><td>-0.8613013</td><td>0.06210025</td><td>0.7127281</td></tr><tr><td>5</td><td>31603</td><td>FRANCE</td><td>F</td><td>-0.6667484</td><td>0.06210025</td><td>0.7127281</td></tr><tr><td>6</td><td>74374</td><td>FRANCE</td><td>F</td><td>-0.6776579</td><td>-0.72854192</td><td>-0.3901693</td></tr></tbody></table><table><thead><tr><th>Type.de.DP</th><th>Taille</th><th>Poids</th><th>Taille_m</th><th>IMC</th><th>Stature</th></tr></thead><tbody><tr><td>DPCA</td><td>-3.490473</td><td>-2.724799</td><td>-3.490473</td><td>-2.479468</td><td>Petite</td></tr><tr><td>DPCA</td><td>-3.592773</td><td>-2.565011</td><td>-3.592773</td><td>-2.232003</td><td>Petite</td></tr><tr><td>DPA quotidienne</td><td>-2.672075</td><td>-2.533053</td><td>-2.672075</td><td>-2.379127</td><td>Petite</td></tr><tr><td>DPA quotidienne</td><td>-2.467476</td><td>-2.405222</td><td>-2.467476</td><td>-2.251172</td><td>Petite</td></tr><tr><td>DPCA</td><td>-1.649077</td><td>-2.405222</td><td>-1.649077</td><td>-2.407428</td><td>Petite</td></tr><tr><td>DPCA</td><td>-2.160576</td><td>-2.277392</td><td>-2.160576</td><td>-2.147836</td><td>Petite</td></tr></tbody></table>
La fonction `mutate_at()` est employer pour préciser les variables numériques que nous souhaitons
centrer réduire:

mydata_num_cr2 <- mydata %>%
  mutate_at("Age.lere.DP", scale)

head(mydata_num_cr2)

<table><thead><tr><th>code.post</th><th>PAYS</th><th>sexe</th><th>Age.lere.DP</th><th>Charlson</th><th>Charlson_modif</th><th>Type.de.DP</th></tr></thead><tbody><tr><td>1</td><td>FRANCE</td><td>F</td><td>-2.7237972</td><td>3</td><td>3</td><td>DPCA</td></tr><tr><td>2</td><td>TUNISIE</td><td>F</td><td>-0.8685743</td><td>3</td><td>2</td><td>DPCA</td></tr><tr><td>3</td><td>LUXEMBOURG</td><td>M</td><td>-2.8007698</td><td>5</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>4</td><td>FRANCE</td><td>F</td><td>-0.8613013</td><td>6</td><td>5</td><td>DPA quotidienne</td></tr><tr><td>5</td><td>FRANCE</td><td>F</td><td>-0.6667484</td><td>6</td><td>5</td><td>DPCA</td></tr><tr><td>6</td><td>FRANCE</td><td>F</td><td>-0.6776579</td><td>4</td><td>3</td><td>DPCA</td></tr></tbody></table><table><thead><tr><th>Taille</th><th>Poids</th><th>Taille_m</th><th>IMC</th><th>Stature</th></tr></thead><tbody><tr><td>132</td><td>30.0</td><td>1.32</td><td>22.72727</td><td>Petite</td></tr><tr><td>131</td><td>32.5</td><td>1.31</td><td>24.80916</td><td>Petite</td></tr><tr><td>140</td><td>33.0</td><td>1.40</td><td>23.57143</td><td>Petite</td></tr><tr><td>142</td><td>35.0</td><td>1.42</td><td>24.64789</td><td>Petite</td></tr><tr><td>150</td><td>35.0</td><td>1.50</td><td>23.33333</td><td>Petite</td></tr><tr><td>145</td><td>37.0</td><td>1.45</td><td>25.51724</td><td>Petite</td></tr></tbody></table>

## 5.4 Liste des fonctions utilisables

Le package dyplr propose de nombreuses fonctions très utiles qui peuvent être employées dans une fonction `mutate()` pour transformer ou créer des variables :

### Vector Functions

**TO USE WITH MUTATE ()**

`mutate()` and `transmute()` apply vectorized functions to columns to create new columns. Vectorized functions take vectors as input and return vectors of the same length as output.

<figure><img src="image_22.png" /></figure>

**OFFSETS**

`dplyr::lag()` - Offset elements by 1
`dplyr::lead()` - Offset elements by 1

**CUMULATIVE AGGREGATES**

`dplyr::cumall()` - Cumulative all()
`dplyr::cumany()` - Cumulative any()
`cummax()` - Cumulative max()
`dplyr::cummean()` - Cumulative mean()
`cummin()` - Cumulative min()
`cumprod()` - Cumulative prod()
`cumsum()` - Cumulative sum()

**RANKINGS**

`dplyr::cume_dist()` - Proportion of all values <=
`dplyr::dense_rank()` - rank with ties = min, no gaps
`dplyr::min_rank()` - rank with ties = min
`dplyr::ntile()` - bins into n bins
`dplyr::percent_rank()` - min_rank scaled to [0,1]
`dplyr::row_number()` - rank with ties = "first"

**MATH**

`+`, `-`, `*`, `/`, `^`, `%`, `/%`, `%%` - arithmetic ops
`log()`, `log2()`, `log10()` - log5
`<=`, `>=`, `>`, `=`, `!=` - logical comparisons

`dplyr::between()` - `x >=` left & `x <=` right
`dplyr::near()` - `safe ==` for floating point
numbers

**MISC**

`dplyr::case When()` - multi-case `if_else()`
`Iris %>% mutate(Species = case When(
  Species == "versicolor" - "versi",
  Species == "virginica" - "virgi",
  TRUE - Species))`

`dplyr::coalesce()` - first non-NA values by element across a set of vectors
`dplyr::if_else()` - element-wise `if()` + `else()`
`dplyr::na_if()` - replace specific values with NA
`pmax()` - element-wise max()
`pmin()` - element-wise min()
`dplyr::recode()` - Vectorized switch()
`dplyr::recode_factor()` - Vectorized switch()
for factors
# 6 Calculer un paramètre

## 6.1 De manière globale

La fonction summarise() permet de calculer un paramètre descriptif, comme une moyenne, la valeur minimum, la valeur maximum etc... Voici un exemple de commande qui peut être employée pour calculer la moyenne, la médiane, le min, le max et l'écart type de la Taille :

```
mydata %>%
  summarise(moy=mean(Taille, na.rm=TRUE),
    med=median(Taille, na.rm=TRUE),
    min=min(Taille, na.rm=TRUE),
    max=max(Taille, na.rm=TRUE),
    ecart_type=sd(Taille, na.rm=TRUE))
```

```
## moy med min max ecart_type
```

```
## 1 166.1201 166 100 196 9.775194
```

## 6.2 Par sous-groupes

Un des grands intérêts de cette fonction summarise(), réside dans son couplage avec la fonction group_by(). La combinaison de ces fonctions permet alors d'obtenir l'estimation de paramètres pour différents sous-groupes de données.

Ainsi, si nous souhaitons obtenir les paramètres précédents, en fonction des pays, nous pouvons employer en amont la syntaxe group_by(PAYS)%>%, comme ceci :

```
mydata %>%
  group_by(PAYS) %>%
  summarise(Nb=n(),
    moy=mean(Taille, na.rm=TRUE),
    med=median(Taille, na.rm=TRUE),
    min=min(Taille, na.rm=TRUE),
    max=max(Taille, na.rm=TRUE),
    ecart_type=sd(Taille, na.rm=TRUE))
```

```
## # A tibble: 6 x 7
```

<table><thead><tr><th>PAYS</th><th>Nb</th><th>moy</th><th>med</th><th>min</th><th>max</th><th>ecart_type</th></tr></thead><tbody><tr><td>1 BELGIQUE</td><td>244</td><td>167.</td><td>168</td><td>120</td><td>194</td><td>9.24</td></tr><tr><td>2 FRANCE</td><td>2639</td><td>166.</td><td>166</td><td>100</td><td>196</td><td>9.74</td></tr><tr><td>3 LUXEMBOURG</td><td>10</td><td>171.</td><td>174</td><td>140</td><td>195</td><td>16.5</td></tr><tr><td>4 MAROC</td><td>99</td><td>164.</td><td>165</td><td>126</td><td>186</td><td>10.3</td></tr><tr><td>5 SUISSE</td><td>33</td><td>167.</td><td>168</td><td>150</td><td>185</td><td>10.3</td></tr><tr><td>6 TUNISIE</td><td>107</td><td>166.</td><td>168</td><td>131</td><td>190</td><td>10.1</td></tr></tbody></table>

Nous pouvons utiliser plusieurs variables dans la fonction group_by(), par exemple le pays et le sexe, comme ceci :
```
mydata %>%
  group_by(PAYS, sexe) %>%
  summarise(Nb=n(),
    moy=mean(Taille, na.rm=TRUE),
    med=median(Taille, na.rm=TRUE),
    min=min(Taille, na.rm=TRUE),
    max=max(Taille, na.rm=TRUE),
    ecart_type=sd(Taille, na.rm=TRUE))
```

```
## # A tibble: 12 x 8
```

```
## # Groups: PAYS [6]
```

<table><thead><tr><th>PAYS</th><th>sexe</th><th>Nb</th><th>moy</th><th>med</th><th>min</th><th>max</th><th>ecart_type</th></tr></thead><tbody><tr><td>1 BELGIQUE</td><td>F</td><td>91</td><td>161.</td><td>162</td><td>140</td><td>177</td><td>6.90</td></tr><tr><td>2 BELGIQUE</td><td>M</td><td>153</td><td>171.</td><td>170</td><td>120</td><td>194</td><td>8.44</td></tr><tr><td>3 FRANCE</td><td>F</td><td>1056</td><td>159.</td><td>159</td><td>120</td><td>186</td><td>7.48</td></tr><tr><td>4 FRANCE</td><td>M</td><td>1583</td><td>171.</td><td>170</td><td>100</td><td>196</td><td>8.12</td></tr><tr><td>5 LUXEMBOURG</td><td>F</td><td>2</td><td>158.</td><td>158.</td><td>151</td><td>164</td><td>9.19</td></tr><tr><td>6 LUXEMBOURG</td><td>M</td><td>8</td><td>175.</td><td>176</td><td>140</td><td>195</td><td>16.4</td></tr><tr><td>7 MAROC</td><td>F</td><td>55</td><td>159.</td><td>160</td><td>126</td><td>178</td><td>9.07</td></tr><tr><td>8 MAROC</td><td>M</td><td>44</td><td>171.</td><td>170</td><td>154</td><td>186</td><td>7.87</td></tr><tr><td>9 SUISSE</td><td>F</td><td>13</td><td>158.</td><td>157</td><td>150</td><td>172</td><td>6.63</td></tr><tr><td>10 SUISSE</td><td>M</td><td>20</td><td>173.</td><td>174.</td><td>155</td><td>185</td><td>7.54</td></tr><tr><td>11 TUNISIE</td><td>F</td><td>48</td><td>161.</td><td>161</td><td>131</td><td>184</td><td>9.10</td></tr><tr><td>12 TUNISIE</td><td>M</td><td>59</td><td>171.</td><td>172</td><td>145</td><td>190</td><td>8.35</td></tr></tbody></table>

Et bien entendu, si nous le souhaitons, nous pouvons stocker ces paramètres dans une nouvelle table de données, qui pourra ensuite, par exemple, être utilisée pour créer des visualisations. Pour cela, il nous suffit d'utiliser une assignation (avec une flèche, en amont) :

```
new_table <- mydata %>%
  group_by(PAYS, sexe) %>%
  summarise(Nb=n(),
    moy=mean(Taille, na.rm=TRUE),
    med=median(Taille, na.rm=TRUE),
    min=min(Taille, na.rm=TRUE),
    max=max(Taille, na.rm=TRUE),
    ecart_type=sd(Taille, na.rm=TRUE))
```

```
head(new_table)
```

```
## # A tibble: 6 x 8
```

```
## # Groups: PAYS [3]
```

<table><thead><tr><th>PAYS</th><th>sexe</th><th>Nb</th><th>moy</th><th>med</th><th>min</th><th>max</th><th>ecart_type</th></tr></thead><tbody><tr><td>1 BELGIQUE</td><td>F</td><td>91</td><td>161.</td><td>162</td><td>140</td><td>177</td><td>6.90</td></tr><tr><td>2 BELGIQUE</td><td>M</td><td>153</td><td>171.</td><td>170</td><td>120</td><td>194</td><td>8.44</td></tr><tr><td>3 FRANCE</td><td>F</td><td>1056</td><td>159.</td><td>159</td><td>120</td><td>186</td><td>7.48</td></tr><tr><td>4 FRANCE</td><td>M</td><td>1583</td><td>171.</td><td>170</td><td>100</td><td>196</td><td>8.12</td></tr><tr><td>5 LUXEMBOURG</td><td>F</td><td>2</td><td>158.</td><td>158.</td><td>151</td><td>164</td><td>9.19</td></tr><tr><td>6 LUXEMBOURG</td><td>M</td><td>8</td><td>175.</td><td>176</td><td>140</td><td>195</td><td>16.4</td></tr></tbody></table>
## 6.3 Liste des fonctions utilisables dans summarise():

Voici une liste de fonctions qui peuvent être utilisées dans la fonction summarise() pour résumer de l'information :

### Summary Functions

**TO USE WITH SUMMARISE ()**

summarise() applies summary functions to columns to create a new table. Summary functions take vectors as input and return single values as output.

**summary function**

**COUNTS**

dplyr::n() - number of values/rows
dplyr::n_distinct() - # of uniques
sum(!is.na()) - # of non-NA's

**LOCATION**

mean() - mean, also mean(!is.na())
median() - median

**LOGICALS**

mean() - Proportion of TRUE's
sum() - # of TRUE's

**POSITION/ORDER**

dplyr::first() - first value
dplyr::last() - last value
dplyr::nth() - value in nth location of vector

**RANK**

quantile() - nth quantile
min() - minimum value
max() - maximum value

**SPREAD**

IQR() - Inter-Quartile Range
mad() - median absolute deviation
sd() - standard deviation
var() - variance

## 7. Conclusion

J'espère que cet article vous aura convaincu, à la fois sur les capacités du package dplyr à manipuler les données, mais aussi sur sa facilité d'utilisation.

Notez, néanmoins, que les fonctions select(), filter(), mutate(), et summarise() offrent de nombreuses autres possibilités, qu'il est impossible de détailler dans un seul article.

Si vous souhaitez explorer ces possibilités, vous pouvez consulter le blog de suzan Baert, notamment les pages :

* Data Wrangling Part 1: Basic to Advanced Ways to Select Columns https://suzan.rbind.io/2018/01/dplyr-tutorial-1/

* Data Wrangling Part 2: Transforming your columns into the right shape https://suzan.
rbind.io/2018/02/dplyr-tutorial-2/

* Data Wrangling Part 3: Basic and more advanced ways to filter rows https://suzan.rbind.io/2018/02/dplyr-tutorial-3/

* Data Wrangling Part 4: Summarizing and slicing your data https://suzan.rbind.io/2018/04/dplyr-tutorial-4/

Open Access : cet article est sous licence Creative commons CC BY 4.0 : https://creativecommons.org/licenses/by/4.0/deed.fr

Vous êtes autorisé à :

Partager — copier, distribuer et communiquer le matériel par tous moyens et sous tous formats

Adapter — remixer, transformer et créer à partir du matériel pour toute utilisation, y compris commerciale.

Cette licence est acceptable pour des œuvres culturelles libres.

L'Offrant ne peut retirer les autorisations concédées par la licence tant que vous appliquez les termes de cette licence, selon les conditions suivantes :

Attribution — Vous devez créditer l'Œuvre, intégrer un lien vers la licence et indiquer si des modifications ont été effectuées à l'Oeuvre. Vous devez indiquer ces informations par tous les moyens raisonnables, sans toutefois suggérer que l'Offrant vous soutient ou soutient la façon dont vous avez utilisé son Oeuvre. http://creativecommons.org/licenses/by/4.0/.