07 septembre 2022
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
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.
Installer la dernière version.
Utiliser le codage UTF8 pour tous les fichiers:
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"
NULL
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
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 , .groups='drop') %>% # 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 ## # … with 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_point
geom_boxplot
ggplot(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 :