12 septembre 2025
Rester à jour : version mineure en cours, ex.: 4.1
version$version.string
## [1] "R version 4.5.1 (2025-06-13)"
Mettre à jour RStudio à chaque mise à jour de R
Référence : Travailler avec R, chapitre 1
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.
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.
Créer un projet, y placer tous les fichiers.
Scripts dans le dossier du projet.
Données dans data.
Ecrire un script dans un projet R, le commenter abondamment.
Utiliser dès que possible des blocs-note RMarkdown.
Aide des fonctions dans R.
Google.
Vignettes des packages.
Pour collaborer, partager le dossier du projet.
Utiliser dès que possible GitHub.
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.
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
Des valeurs :
(x <- 1)
## [1] 1
(x <- c("pommes", "poires"))
## [1] "pommes" "poires"
(x <- c(TRUE, FALSE))
## [1] TRUE FALSE
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
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
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
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
Utiliser les crochets :
y[y%%2 == 0]
## [1] 16 14 18
Les compter :
sum(y%%2 == 0)
## [1] 3
Les vecteurs contiennent des données de même mode :
1:2, 1L (L pour un entier)(1+1i)*(1-1i) égale 2TRUE"Bonjour"NULLLes 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
A[1, 2]
## [1] 4
A[, 3]
## [1] 7 8 9
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
Comme dans une matrice :
A[, , 2]
## [,1] [,2] [,3] ## [1,] 10 13 16 ## [2,] 11 14 17 ## [3,] 12 15 18
Eléments disparates :
(L <- list(noms = c("X", "Y"), tailles = c(100, 120)))
## $noms ## [1] "X" "Y" ## ## $tailles ## [1] 100 120
Double crochet ou nom :
L[[2]]
## [1] 100 120
L$noms
## [1] "X" "Y"
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élection comme dans une matrice…
df[2, ]
## nom taille ## 2 Y 120
… ou comme dans une liste
df$taille
## [1] 100 120
Sélection de lignes en fonction de valeurs
df[df$taille == 100, ]
## nom taille ## 1 X 100
R est un langage fonctionnel.
y <- cos(pi)
Une fonction produit une valeur à partir d’arguments.
Une fonction peut avoir des effets de bord :
x <- plot(y)
x
## NULL
plot n’est utilisé que pour ses effets de bord.
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
Bonne pratique : nommer tous les arguments à partir du deuxième:
runif(3, min = 0, max = 1)
## [1] 0.1005619 0.4669571 0.4286474
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
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
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
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 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")
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()
library("entropart")
Ns <- as.AbdVector(Ns)
class(Ns)
## [1] "AbdVector" "SpeciesDistribution" ## [3] "integer"
plot(Ns) # plot.SpeciesDistribution
Univers bien rangé.
Extension de R : ensemble de packages
library("tidyverse")
Manifeste
vignette("manifesto")
Introduction à R et au tidyverse, Le tidyverse
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
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
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) %>%
# Trier par G/ha décroissant
arrange(desc(Surface)) ->
mon_tibble
Travail fastidieux :
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 ## # ℹ 41 more rows
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).
L’esthétique désigne ce qui est représenté :
x et y (ou fill pour un histogramme…)geom_.Fonction aes() à plusieurs niveaux :
mapping de ggplot(), hérité par les couches (geom_)mapping de chaque couche.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))
Chaque geom_ va de pair avec une statistique de transformation des données :
geom_pointgeom_boxplotggplot(data = diamonds) +
stat_summary(
mapping = aes(x = cut, y = depth),
fun.min = min,
fun.max = max,
fun = median
)
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")
La position définit l’emplacement des objets sur le graphique.
geom_point pour éviter les superpositions.ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut, fill = color), position = "stack") + scale_fill_brewer(palette = "Set1")
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_),Exemple : tracer la carte des wapas de la parcelle 6.
read_csv2("data/Paracou6.csv") %>%
filter(Genus == "Eperua") %>%
ggplot() + geom_point(aes(x = Xfield, y = Yfield,
size = CircCorr, color = Species)) + coord_fixed() ->
P6Map
P6Map
Présente plusieurs aspects du même graphique:
P6Map + facet_wrap(~Species)
Possibilité d’affiner un graphique
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/
git (contrôle de source) et GitHub (plateforme web) pour :
Il existe des packages pour tout.
Exemples :