07 septembre 2022

Installation

R doit être installé proprement

Rester à jour : version mineure en cours, ex.: 4.1

version$version.string
## [1] "R version 4.2.1 (2022-06-23)"

Mettre à jour RStudio à chaque mise à jour de R

Référence : Travailler avec R, chapitre 1

Choisir un dossier de travail

Le dossier Home : ~

Toujours travailler dans un projet : File / New Project…

Ne jamais utiliser setwd() pour définir le dossier de travail : c’est toujours celui du projet.

Packages

Les packages étendent les possibilités de R.

Installation depuis un dépôt officiel avec contrôle de qualité : CRAN.

Menu Tools / Install Packages…

Les packages sont installés dans %localappdata%/R/win-library/4.2/ pour R version 4.2.

RStudio

Installer la dernière version.

Utiliser le codage UTF8 pour tous les fichiers:

  • Menu “File > New File > R Script”,
  • “File > Save with Encoding…”, choisir UTF8,
  • Cocher “Set as default encoding for source files”,
  • Enregistrer puis supprimer le fichier.

Démarrage

Les fenêtres de RStudio

Travailler dans un projet

Créer un projet, y placer tous les fichiers.

Scripts dans le dossier du projet.

Données dans data.

Un fichier par traitement

Ecrire un script dans un projet R, le commenter abondamment.

Utiliser dès que possible des blocs-note RMarkdown.

Utiliser les aides

Aide des fonctions dans R.

Google.

Vignettes des packages.

Echanger le projet complet

Pour collaborer, partager le dossier du projet.

Utiliser dès que possible GitHub.

Données

Les variables

Ecrire en haut à gauche.

# Affectation
a <- 1
# ou encore
1 -> a
# mais éviter
a = 1

Exécuter (Ctrl+Entrée) : voir en bas à gauche. Environnement en haut à droite.

R manipule des vecteurs

Plutôt que des nombres :

x <- 1:5
2 * x
## [1]  2  4  6  8 10
sqrt(x)
## [1] 1.000000 1.414214 1.732051 2.000000 2.236068

Introduction à R et au tidyverse, Prise en main

Créer des vecteurs (1)

Des valeurs :

(x <- 1)
## [1] 1
(x <- c("pommes", "poires"))
## [1] "pommes" "poires"
(x <- c(TRUE, FALSE))
## [1]  TRUE FALSE

Créer des vecteurs (2)

Une séquence :

(x <- 1:5)
## [1] 1 2 3 4 5
(x <- seq(from = 1, to = 5, by = 1))
## [1] 1 2 3 4 5

Créer des vecteurs (3)

Une répétition :

(x <- rep(1, 5))
## [1] 1 1 1 1 1
(x <- rep(1:2, each = 2))
## [1] 1 1 2 2

Utiliser systématiquement l’aide

?rep

Sélectionner des éléments (1)

Utiliser les crochets :

x <- (1:10) * 10
x[3]
## [1] 30
x[-5]
## [1]  10  20  30  40  60  70  80  90 100

Utiliser des vecteurs pour sélectionner :

x[c(1, 3)]
## [1] 10 30

Tester des éléments

Tirer des nombres dans une séquence, trouver lesquels sont pairs.

x <- 1:100
# Échantillonnage
(y <- sample(x, 5))
## [1] 91 16 67 14 18
(y%%2 == 0)
## [1] FALSE  TRUE FALSE  TRUE  TRUE

Sélectionner des éléments (2)

Utiliser les crochets :

y[y%%2 == 0]
## [1] 16 14 18

Les compter :

sum(y%%2 == 0)
## [1] 3

Modes

Les vecteurs contiennent des données de même mode :

  • numérique : 1:2, 1L (L pour un entier)
  • imaginaire : (1+1i)*(1-1i) égale 2
  • logique : TRUE
  • caractère : "Bonjour"
  • vide : NULL

Matrices

Les matrices ont deux dimensions et contiennent des données de même mode

(A <- matrix(1:9, nrow = 3))
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

Sélectionner dans une matrice

A[1, 2]
## [1] 4
A[, 3]
## [1] 7 8 9

Tableaux

Extension des matrices à plus de deux dimensions

A <- array(1:18, dim = c(3, 3, 2))
A
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18

Sélectionner dans un tableau

Comme dans une matrice :

A[, , 2]
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18

Listes

Eléments disparates :

(L <- list(noms = c("X", "Y"), tailles = c(100, 120)))
## $noms
## [1] "X" "Y"
## 
## $tailles
## [1] 100 120

Sélectionner dans une liste

Double crochet ou nom :

L[[2]]
## [1] 100 120
L$noms
## [1] "X" "Y"

Dataframe

Tableau dont chaque colonne est de mode unique :

(df <- data.frame(nom = c("X", "Y"), taille = c(100,
    120)))
##   nom taille
## 1   X    100
## 2   Y    120

Sélectionner dans un dataframe (1)

Sélection comme dans une matrice…

df[2, ]
##   nom taille
## 2   Y    120

… ou comme dans une liste

df$taille
## [1] 100 120

Sélectionner dans un dataframe (2)

Sélection de lignes en fonction de valeurs

df[df$taille == 100, ]
##   nom taille
## 1   X    100

Fonctions

Définition

R est un langage fonctionnel.

y <- cos(pi)

Une fonction produit une valeur à partir d’arguments.

Effets de bord

Une fonction peut avoir des effets de bord :

x <- plot(y)

x
## NULL

plot n’est utilisé que pour ses effets de bord.

Arguments

Appeler une fonction en nommant tous ses arguments…

runif(n = 3, min = 0, max = 1)
## [1] 0.10293624 0.02248227 0.91641919

… ou en les passant dans l’ordre :

runif(3, 0, 1)
## [1] 0.9096517 0.1370688 0.3397247

Arguments nommés

Bonne pratique : nommer tous les arguments à partir du deuxième:

runif(3, min = 0, max = 1)
## [1] 0.1005619 0.4669571 0.4286474

Valeurs par défaut

Voir l’aide de la fonction : ?runif

min et max ont des valeurs par défaut : 0 et 1.

runif(3)
## [1] 0.53216272 0.09179518 0.02105684

Créer

Syntaxe:

puissance <- function(x, r = 1) {
    return(x^r)
}
puissance(1:3, r = 2)
## [1] 1 4 9

Penser vecteur. r est recyclé.

puissance(1:3, r = 3:1)
## [1] 1 4 3

Structures de contrôle

Si / Sinon

est_pair <- function(x) {
    if (x%%2 == 0) {
        return(TRUE)
    } else {
        return(FALSE)
    }
}
est_pair(3)
## [1] FALSE

Fonction non vectorielle. Utiliser plutôt :

((1:3)%%2) == 0
## [1] FALSE  TRUE FALSE

Boucles

for (i in 1:3) {
    print(sqrt(i))
}
## [1] 1
## [1] 1.414214
## [1] 1.732051

Seulement si la fonction utilisée n’est pas vectorielle.

sqrt(1:3)
## [1] 1.000000 1.414214 1.732051

Graphiques de base

plot

Graphiques simples :

X <- 1:10
Y <- 2 * X + rnorm(length(X))
plot(x = X, y = Y)
lines(x = X, y = Y, col = "green", lty = 2)
abline(a = 0, b = 2, col = "red")

Classes (1)

Les objets appartiennent à des classes.

Ns <- rlnorm(100)
class(Ns)
## [1] "numeric"

plot est une méthode, déclinée par classe.

plot(Ns)  # plot.numeric()

Classes (2)

library("entropart")
Ns <- as.AbdVector(Ns)
class(Ns)
## [1] "AbdVector"           "SpeciesDistribution"
## [3] "integer"
plot(Ns)  # plot.SpeciesDistribution

Tidyverse

Manifeste

Univers bien rangé.

Extension de R : ensemble de packages

library("tidyverse")

Manifeste

vignette("manifesto")

Introduction à R et au tidyverse, Le tidyverse

Données

Autant que possible dans un dataframe.

tibble : dataframe amélioré.

(mon_tibble <- tibble(nom = c("X", "Y"), taille = c(100,
    120)))
## # A tibble: 2 × 2
##   nom   taille
##   <chr>  <dbl>
## 1 X        100
## 2 Y        120

Tuyau

Le résultat d’une fonction est le premier argument de la fonction suivante.

x <- runif(100, max = 10) %>%
    mean()
x
## [1] 4.847069
# ou même
100 %>%
    runif(max = 10) %>%
    mean() %>%
    print() -> x
## [1] 5.18077

Bagarre (1)

Data wrangling : lecture des données dans un tibble, sélection des lignes et colonnes, création de colonnes…

# Lecture des arbres de la parcelle 6 de Paracou
read_csv2("data/Paracou6.csv") %>% 
  # Ne garder que les fabaceae
  filter(Family == "Fabaceae") %>% 
  # Sélectionner les colonnes espèce et circonférence
  select(spName, CircCorr) %>% 
  # Calculer la surface terrière de chaque arbre en m2
  mutate(G = CircCorr^2/4/pi/10000) %>% 
  # Grouper par espèce
  group_by(spName) %>%
  # Calculer le nombre de tiges et la surface terrière par ha
  summarize(Abondance=n(), Surface=sum(G)/6.25 , .groups='drop') %>% 
  # Trier par G/ha décroissant
  arrange(desc(Surface)) ->
  mon_tibble

Bagarre (2)

Travail fastidieux :

  • prévoir du temps
  • capitaliser.

mon_tibble
## # A tibble: 46 × 3
##   spName                 Abondance Surface
##   <chr>                      <int>   <dbl>
## 1 Eperua_falcata               266   5.68 
## 2 Eperua_grandiflora            67   1.50 
## 3 Vouacapoua_americana          91   1.44 
## 4 Dicorynia_guianensis          44   0.762
## 5 Recordoxylon_speciosum        31   0.438
## # … with 41 more rows

Graphiques avec ggplot

ggplot2

Package destiné à la création de graphiques.

Respecte la grammaire graphique par couches :

ggplot(data = <DATA>) + 
  <GEOM_FUNCTION>(
     mapping = aes(<MAPPINGS>),
     stat = <STAT>, 
     position = <POSITION>
  ) +
  <COORDINATE_FUNCTION> +
  <FACET_FUNCTION>

Les données sont obligatoirement un dataframe (un tibble est un dataframe).

Esthétique

L’esthétique désigne ce qui est représenté :

  • x et y (ou fill pour un histogramme…)
  • transparence, couleur, type de courbe, taille… : voir l’aide de chaque geom_.

Fonction aes() à plusieurs niveaux :

  • argument mapping de ggplot(), hérité par les couches (geom_)
  • ou argument mapping de chaque couche.

Géométrie

La géométrie est définie par une fonction geom_xxx et une esthétique (ce qui est représenté).

ggplot(data = diamonds) + 
  geom_point(mapping = aes(x = carat, y = price, color = cut)) 

Statistiques (1)

Chaque geom_ va de pair avec une statistique de transformation des données :

  • “identity” pour geom_point
  • “boxplot” pour geom_boxplot
  • 20 statistiques disponibles…

Statistiques (2)

ggplot(data = diamonds) + 
  stat_summary(
    mapping = aes(x = cut, y = depth),
    fun.min = min,
    fun.max = max,
    fun = median
  )

Echelle

Transformation de variable.

diamonds %>%
    filter(carat > 0.5) %>%
    ggplot(aes(x = carat, y = price)) + geom_point() +
    scale_x_log10() + scale_y_log10() + geom_smooth(method = "lm")

Position (1)

La position définit l’emplacement des objets sur le graphique.

  • “identity” en général,
  • “stack” empile les catégories dans un histogramme,
  • “jitter” déplace aléatoirement les points dans un geom_point pour éviter les superpositions.

Position (2)

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = color), position="stack") + 
  scale_fill_brewer(palette = "Set1")

Coordonnées (1)

Système de coordonnées :

  • coord_flip() intervertit x et y,
  • coord_polar() : coordonnées polaires,
  • coord_trans() transforme l’affichage des coordonnées (mais pas les données comme scale_),
  • etc.

Exemple : tracer la carte des wapas de la parcelle 6.

Coordonnées (2)

read_csv2("data/Paracou6.csv") %>%
    filter(Genus == "Eperua") %>%
    ggplot() + geom_point(aes(x = Xfield, y = Yfield,
    size = CircCorr, color = Species)) + coord_fixed() ->
    P6Map
P6Map

Facettes

Présente plusieurs aspects du même graphique:

P6Map + facet_wrap(~Species)

Possibilité d’affiner un graphique

Aller plus loin

Rédiger avec RMarkdown

Plutôt qu’un code commenté, un texte avec du code.

Tricot : production de documents HTML ou PDF.

Rédaction d’articles, de mémoires, de diaporama.

Reproductibilité : le projet contient les données, le code, le texte et le modèle de mise en forme.

Galerie : https://ericmarcon.github.io/memoiR/

Contrôle de source

git (contrôle de source) et GitHub (plateforme web) pour :

  • tracer les versions d’un projet,
  • collaborer,
  • tester le code automatiquement,
  • tricoter automatiquement.

Exemple: https://github.com/EricMarcon/travailleR

Sites web etc.