Introduction à R
Dernière mise à jour le 2024-09-12 | Modifier cette page
Vue d'ensemble
Questions
- Premières commandes dans R
Objectifs
- Définissez les termes suivants relatifs à R : objet, affectation, appel, fonction, arguments, options.
- Attribuez des valeurs aux objets dans R.
- Apprenez à nommer des objets
- Utilisez les commentaires pour informer le script.
- Résoudre des opérations arithmétiques simples dans R.
- Appelez des fonctions et utilisez des arguments pour modifier leurs options par défaut.
- Inspectez le contenu des vecteurs et manipulez leur contenu.
- Sous-ensembler et extraire des valeurs à partir de vecteurs.
- Analysez les vecteurs avec des données manquantes.
Cet épisode est basé sur la leçon Analyse des données et Visualisation dans R pour les écologistes de Data Carpentries.
Créer des objets dans R
Vous pouvez obtenir le résultat de R simplement en tapant math dans la console :
R
3 + 5
SORTIE
[1] 8
R
12 / 7
SORTIE
[1] 1.714286
Cependant, pour faire des choses utiles et intéressantes, nous devons
attribuer des valeurs à objets. Pour créer un objet,
nous devons lui donner un nom suivi de l’opérateur d’affectation
<-
, et de la valeur que nous voulons lui donner :
R
poids_kg <- 55
<-
est l’opérateur d’affectation. Il attribue des
valeurs à droite aux objets à gauche. Ainsi, après avoir exécuté
x <- 3
, la valeur de x
est 3
.
La flèche peut être lue comme 3 entre dans
x
. Pour des raisons historiques , vous pouvez également
utiliser =
pour les affectations, mais pas dans tous les
contextes . En raison du légères
différences dans la syntaxe, il est une bonne pratique de toujours
utiliser <-
pour les affectations.
In RStudio, typing Alt + - (push Alt
at the same time as the - key) will write <-
in a single keystroke in a PC, while typing Option +
- (push Option at the same time as the
- key) does the same in a Mac.
Nommer les variables
Les objets peuvent recevoir n’importe quel nom tel que « x », «
current_temperature » ou « subject_id ». Vous voulez que les noms de vos
objets soient explicites et pas trop longs. Ils ne peuvent pas commencer
par un nombre (2x
n’est pas valide, mais x2
l’est). R est sensible à la casse (par exemple, weight_kg
est différent de Weight_kg
). Certains noms ne peuvent pas
être utilisés car ils sont les noms de fonctions fondamentales dans R
(par exemple, if
, else
, for
, voir
ici
pour une liste complète). En général, même si c’est autorisé, il est
préférable de de ne pas utiliser d’autres noms de fonctions (par
exemple, c
, T
, mean
,
data
, df
, poids
). En cas de
doute, consultez l’aide pour voir si le nom est déjà utilisé. Il est
également préférable d’éviter les points (.
) dans un nom
d’objet comme dans my.dataset
. There are many functions in
R with dots in their names for historical reasons, but because dots have
a special meaning in R (for methods) and other programming languages,
it’s best to avoid them. Il est également recommandé d’utiliser des noms
pour les noms d’objets et des verbes pour les noms de fonctions. Il est
important d’être cohérent dans le style de votre code (où vous placez
les espaces, comment vous nommez les objets, etc.). L’utilisation d’un
style de codage cohérent rend votre code plus clair à lire pour votre
futur moi et vos collaborateurs. Dans R, certains guides de style
populaires sont de Google, le
tidyverse et le
Bioconductor style guide. Le Tidyverse est très complet et peut sembler
écrasant au début . Vous pouvez installer le package lintr
pour vérifier automatiquement les problèmes dans le style de votre
code.
Objets et variables : ce que l’on appelle des « objets » dans « R » sont connus sous le nom de « variables » dans de nombreux autres langages de programmation. Selon le contexte, « objet » et « variable » peuvent avoir des significations radicalement différentes. Cependant, dans cette leçon, les deux mots sont utilisés de manière synonyme. Pour plus d’informations voir ici.
Lors de l’attribution d’une valeur à un objet, R n’imprime rien. Vous pouvez forcer R à imprimer la valeur en utilisant des parenthèses ou en tapant le nom de l’objet :
R
weight_kg <- 55 # n'imprime rien
(weight_kg <- 55) # mais mettre des parenthèses autour de l'appel imprime la valeur de `weight_kg`
SORTIE
[1] 55
R
weight_kg # et taper également le nom du objet
SORTIE
[1] 55
Maintenant que R a « weight_kg » en mémoire, nous pouvons faire de l’arithmétique avec. Pour exemple, nous pouvons vouloir convertir ce poids en livres (le poids en livres est 2,2 fois le poids en kg) :
R
2.2 * weight_kg
SORTIE
[1] 121
On peut également changer la valeur d’un objet en lui attribuant une nouvelle :
R
weight_kg <- 57.5
2.2 * weight_kg
SORTIE
[1] 126.5
Cela signifie que l’attribution d’une valeur à un objet ne modifie
pas les valeurs de autres objets. Par exemple, stockons le poids de
l’animal en livres dans un nouvel objet , weight_lb
:
R
weight_lb <- 2.2 * weight_kg
puis remplacez « weight_kg » par 100.
R
weight_kg <- 100
commentaires
Le caractère de commentaire dans R est #
, tout ce qui se
trouve à droite d’un #
dans un script sera ignoré par R. Il
est utile de laisser des notes et des explications dans vos scripts
.
RStudio permet de commenter ou décommenter facilement un paragraphe : après sélectionnant les lignes que vous souhaitez commenter, appuyez en même temps sur votre clavier Ctrl + Maj + C. If you only want to comment out one line, you can put the cursor at any location of that line (i.e. no need to select the whole line), then press Ctrl + Shift + C.
Fonctions et leurs arguments
Les fonctions sont des “scripts prédéfinis” qui automatisent des
ensembles de commandes plus complexes , y compris les affectations
d’opérations, etc. De nombreuses fonctions sont prédéfinies ou peuvent
être rendues disponibles en important des packages R (nous en
parlerons plus tard). Une fonction obtient généralement une ou plusieurs
entrées appelées arguments. Les fonctions renvoient souvent
(mais pas toujours) une valeur. Un exemple typique serait la
fonction sqrt()
. L’entrée (l’argument) doit être un nombre
et la valeur de retour (en fait, la sortie ) est la racine carrée de ce
nombre. Exécuter une fonction (« l’exécuter ») est appelé
appeler la fonction. Un exemple d’appel de fonction est :
R
b <- sqrt(a)
Ici, la valeur de a
est donnée à la fonction
sqrt()
, la fonction sqrt()
calcule la racine
carrée, et renvoie la valeur qui est ensuite attribuée à l’objet ‘b’.
Cette fonction est très simple car elle ne prend qu’un seul
argument.
The return ‘value’ of a function need not be numerical (like that of
sqrt()
), and it also does not need to be a single item: it
can be a set of things, or even a dataset. Nous le verrons lorsque nous
lirons des fichiers de données dans R.
Les arguments peuvent être n’importe quoi, non seulement des nombres ou des noms de fichiers, mais aussi d’autres objets . La signification exacte de chaque argument diffère selon la fonction et doit être recherchée dans la documentation (voir ci-dessous). Certaines fonctions prennent des arguments qui peuvent soit être spécifiés par l’utilisateur, soit, s’ils sont laissés de côté, prendre une valeur par défaut : ceux-ci sont appelés options. Les options sont généralement utilisées pour modifier le fonctionnement de la fonction , par exemple si elle ignore les « mauvaises valeurs » ou quel symbole utiliser dans un tracé. Cependant, si vous souhaitez quelque chose de spécifique, vous pouvez spécifier une valeur de votre choix qui sera utilisée à la place de la valeur par défaut.
Essayons une fonction qui peut prendre plusieurs arguments :
round()
.
R
round(3.14159)
SORTIE
[1] 3
Ici, nous avons appelé round()
avec un seul argument,
3.14159
, et il a renvoyé la valeur 3
. En
effet, la valeur par défaut est d’arrondir au nombre entier le plus
proche. Si nous voulons plus de chiffres, nous pouvons voir comment
procéder en obtenant des informations sur la fonction
round
. Nous pouvons utiliser args(round)
ou
consulter l’aide pour cette fonction en utilisant
?round
.
R
args(round)
SORTIE
function (x, digits = 0, ...)
NULL
R
?round
Nous voyons que si nous voulons un nombre différent de chiffres, nous
pouvons taper digits=2
ou autant que nous le voulons.
R
round(3.14159, digits = 2)
SORTIE
[1] 3.14
Si vous fournissez les arguments exactement dans le même ordre que celui dans lequel ils sont définis, vous n’avez pas besoin de les nommer :
R
round(3.14159, 2)
SORTIE
[1] 3.14
Et si vous nommez les arguments, vous pouvez changer leur ordre :
R
round(digits = 2, x = 3.14159)
SORTIE
[1] 3.14
Il est recommandé de placer les arguments non facultatifs (comme le nombre que vous arrondissez ) en premier dans votre appel de fonction et de spécifier les noms de tous les arguments facultatifs. Si vous ne le faites pas, quelqu’un qui lit votre code devra peut-être rechercher la définition d’une fonction avec des arguments inconnus pour comprendre ce que vous faites . En spécifiant le nom des arguments, vous protégez également contre d’éventuelles modifications futures dans l’interface de la fonction, qui peuvent potentiellement ajouter de nouveaux arguments entre ceux existants.
Vecteurs et types de données
Un vecteur est le type de données le plus courant et le plus basique
dans R, et est à peu près le cheval de bataille de R. Un vecteur est
composé d’une série de valeurs, telles que nombres ou caractères. Nous
pouvons attribuer une série de valeurs à un vecteur en utilisant la
fonction c()
. Par exemple, nous pouvons créer un vecteur de
poids d’animaux et l’attribuer à un nouvel objet
weight_g
:
R
weight_g <- c(50, 60, 65, 82)
weight_g
SORTIE
[1] 50 60 65 82
Un vecteur peut également contenir des caractères :
R
molecules <- c("dna", "rna", "protein")
molecules
SORTIE
[1] "dna" "rna" "protein"
Les guillemets autour de « adn », « arn », etc. sont ici essentiels. Sans les guillemets , R supposera qu’il existe des objets appelés « adn », « arn » et « protéine ». Comme ces objets n’existent pas dans la mémoire de R, il y aura un message d’erreur.
Il existe de nombreuses fonctions qui vous permettent d’inspecter le
contenu d’un vecteur . length()
vous indique combien
d’éléments se trouvent dans un vecteur particulier :
R
length(weight_g)
SORTIE
[1] 4
R
length(molecules)
SORTIE
[1] 3
Une caractéristique importante d’un vecteur est que tous les éléments
sont du même type de données. La fonction class()
indique
la classe (le type d’élément ) d’un objet :
R
class(weight_g)
SORTIE
[1] "numeric"
R
class(molecules)
SORTIE
[1] "character"
La fonction str()
fournit un aperçu de la structure d’un
objet et de ses éléments. C’est une fonction utile lorsque vous
travaillez avec des objets volumineux et complexes :
R
str(weight_g)
SORTIE
num [1:4] 50 60 65 82
R
str(molecules)
SORTIE
chr [1:3] "dna" "rna" "protein"
Vous pouvez utiliser la fonction c()
pour ajouter
d’autres éléments à votre vecteur :
R
weight_g <- c(weight_g, 90) # add to the end of the vector
weight_g <- c(30, weight_g) # add to the beginning of the vector
weight_g
SORTIE
[1] 30 50 60 65 82 90
Dans la première ligne, nous prenons le vecteur d’origine
weight_g
, ajoutons la valeur 90
à la fin de
celui-ci et enregistrons le résultat dans weight_g
.
Ensuite, nous ajoutons la valeur « 30 » au début, en enregistrant à
nouveau le résultat dans « weight_g ».
Nous pouvons faire cela encore et encore pour développer un vecteur ou assembler un ensemble de données . Au fur et à mesure que nous programmons, cela peut être utile pour ajouter les résultats que nous collectons ou calculons.
Un vecteur atomique est le type de
données R le plus simple et est un vecteur linéaire d’un seul
type. Ci-dessus, nous avons vu 2 des 6 principaux types de vecteurs
**atomiques ** que R utilise : "caractère"
et
"numérique"
(ou "double"
). Ce sont les
éléments de base à partir desquels tous les objets R sont construits.
Les 4 autres types de vecteurs atomiques sont :
-
"logique"
pourTRUE
etFALSE
(le type de données booléen) -
"integer"
pour les nombres entiers (par exemple,2L
, leL
indique à R que c’est un entier) -
"complexe"
pour représenter des nombres complexes avec des parties réelles et imaginaires (par exemple,1 + 4i
) et c’est tout ce que nous allons dire à leur sujet -
"raw"
pour les bitstreams dont nous ne parlerons pas davantage
Vous pouvez vérifier le type de votre vecteur en utilisant la
fonction typeof()
et en saisissant votre vecteur comme
argument.
Les vecteurs sont l’une des nombreuses structures de
données utilisées par R. Les autres importants sont les listes
(list
), les matrices (matrix
), les trames de
données (data.frame
), les facteurs (factor
) et
les tableaux (array
).
R les convertit implicitement pour qu’ils soient tous du même type
Défi:
Que se passera-t-il dans chacun de ces exemples ? (indice : utilisez
class()
pour vérifier le type de données de vos objets et
tapez leurs noms pour voir ce qui se passe) :
R
num_char <- c(1, 2, 3, "a")
num_logical <- c(1, 2, 3, TRUE, FALSE)
char_logical <- c("a", "b", "c", TRUE)
tricky <- c(1, 2, 3, "4")
R
class(num_char)
SORTIE
[1] "character"
R
num_char
SORTIE
[1] "1" "2" "3" "a"
R
class(num_logical)
SORTIE
[1] "numeric"
R
num_logical
SORTIE
[1] 1 2 3 1 0
R
class(char_logical)
SORTIE
[1] "character"
R
char_logical
SORTIE
[1] "a" "b" "c" "TRUE"
R
class(tricky)
SORTIE
[1] "character"
R
tricky
SORTIE
[1] "1" "2" "3" "4"
Les vecteurs ne peuvent appartenir qu’à un seul type de données. R essaie de convertir (contraindre) le contenu de ce vecteur pour trouver un dénominateur commun qui ne perd aucune information.
Seulement un. Il n’y a pas de mémoire des types de données passés et
la coercition se produit la première fois que le vecteur est évalué. Par
conséquent, le TRUE
dans num_logical
est
converti en 1
avant d’être converti en "1"
dans combined_logical
.
R
combined_logical
SORTIE
[1] "1" "2" "3" "1" "a" "b" "c" "TRUE"
Défi:
Dans R, nous appelons la conversion d’objets d’une classe vers une autre classe coercition. Ces conversions se produisent selon une hiérarchie, selon laquelle certains types sont préférentiellement contraints vers d’autres types. Pouvez-vous dessiner un diagramme qui représente la hiérarchie de la façon dont ces types de données sont forcés ?
logique → numérique → caractère ← logique
Vecteurs de sous-ensemble
Si l’on veut extraire une ou plusieurs valeurs d’un vecteur, il faut fournir un ou plusieurs indices entre crochets. Par exemple:
R
molecules <- c("dna", "rna", "peptide", "protein")
molecules[2]
SORTIE
[1] "rna"
R
molecules[c(3, 2)]
SORTIE
[1] "peptide" "rna"
On peut également répéter les indices pour créer un objet avec plus d’éléments que celui d’origine :
R
more_molecules <- molecules[c(1, 2, 3, 2, 1, 4)]
more_molecules
SORTIE
[1] "dna" "rna" "peptide" "rna" "dna" "protein"
Les indices R commencent à 1. Les langages de programmation comme Fortran, MATLAB, Julia et R commencent à compter à 1, car c’est ce que font généralement les êtres humains . Les langages de la famille C (y compris C++, Java, Perl, et Python) comptent à partir de 0 car c’est plus simple à faire pour les ordinateurs.
Enfin, il est également possible d’obtenir tous les éléments d’un vecteur sauf certains éléments spécifiés en utilisant des indices négatifs :
R
molecules ## all molecules
SORTIE
[1] "dna" "rna" "peptide" "protein"
R
molecules[-1] ## all but the first one
SORTIE
[1] "rna" "peptide" "protein"
R
molecules[-c(1, 3)] ## all but 1st/3rd ones
SORTIE
[1] "rna" "protein"
R
molecules[c(-1, -3)] ## all but 1st/3rd ones
SORTIE
[1] "rna" "protein"
Sous-ensemble conditionnel
Une autre méthode courante de sous-ensemble consiste à utiliser un
vecteur logique. TRUE
sélectionnera l’élément avec le même
index, tandis que FALSE
ne le fera pas :
R
weight_g <- c(21, 34, 39, 54, 55)
weight_g[c(TRUE, FALSE, TRUE, TRUE, FALSE)]
SORTIE
[1] 21 39 54
Généralement, ces vecteurs logiques ne sont pas tapés à la main, mais sont la sortie d’autres fonctions ou tests logiques. Par exemple, si vous souhaitez sélectionner uniquement les valeurs supérieures à 50 :
R
## will return logicals with TRUE for the indices that meet
## the condition
weight_g > 50
SORTIE
[1] FALSE FALSE FALSE TRUE TRUE
R
## so we can use this to select only the values above 50
weight_g[weight_g > 50]
SORTIE
[1] 54 55
Vous pouvez combiner plusieurs tests en utilisant &
(les deux conditions sont vraies, AND) ou |
(au moins une
des conditions est vraie, OR) :
R
weight_g[weight_g < 30 | weight_g > 50]
SORTIE
[1] 21 54 55
R
weight_g[weight_g >= 30 & weight_g == 21]
SORTIE
numeric(0)
Ici, <
signifie “inférieur à”, >
pour
“supérieur à”, >=
pour “supérieur ou égal à” et
==
pour “égal à”. The double equal sign ==
is
a test for numerical equality between the left and right hand sides, and
should not be confused with the single =
sign, which
performs variable assignment (similar to <-
).
Une tâche courante consiste à rechercher certaines chaînes dans un
vecteur. On pourrait utiliser l’opérateur “ou” |
pour
tester l’égalité de plusieurs valeurs, mais cela peut rapidement devenir
fastidieux. La fonction %in%
permet de tester si l’un des
éléments d’un vecteur de recherche est trouvé :
R
molecules <- c("dna", "rna", "protein", "peptide")
molecules[molecules == "rna" | molecules == "dna"] # returns both rna and dna
SORTIE
[1] "dna" "rna"
R
molecules %in% c("rna", "dna", "metabolite", "peptide", "glycerol")
SORTIE
[1] TRUE TRUE FALSE TRUE
R
molecules[molecules %in% c("rna", "dna", "metabolite", "peptide", "glycerol")]
SORTIE
[1] "dna" "rna" "peptide"
R
"four" > "five"
SORTIE
[1] TRUE
Lorsque vous utilisez >
ou <
sur des
chaînes, R compare leur ordre alphabétique. Ici, "quatre"
vient après "cinq"
, et est donc supérieur à .
Des noms
Il est possible de nommer chaque élément d’un vecteur. Le morceau de code ci-dessous montre un vecteur initial sans aucun nom, comment les noms sont définis et récupérés.
R
x <- c(1, 5, 3, 5, 10)
names(x) ## no names
SORTIE
NULL
R
names(x) <- c("A", "B", "C", "D", "E")
names(x) ## now we have names
SORTIE
[1] "A" "B" "C" "D" "E"
Lorsqu’un vecteur possède des noms, il est possible d’accéder aux éléments par leur nom , en plus de leur index.
R
x[c(1, 3)]
SORTIE
A C
1 3
R
x[c("A", "C")]
SORTIE
A C
1 3
Données manquantes
Comme R a été conçu pour analyser des ensembles de données, il inclut le concept de données manquantes (ce qui est rare dans d’autres langages de programmation ). Les données manquantes sont représentées dans les vecteurs par « NA ».
Lorsque vous effectuez des opérations sur des nombres, la plupart des
fonctions renverront « NA » si les données avec lesquelles vous
travaillez incluent des valeurs manquantes. Cette fonctionnalité rend
plus difficile l’ignorance des cas où vous avez affaire à données
manquantes. Vous pouvez ajouter l’argument na.rm = TRUE
pour calculer le résultat en ignorant les valeurs manquantes.
R
heights <- c(2, 4, 4, NA, 6)
mean(heights)
SORTIE
[1] NA
R
max(heights)
SORTIE
[1] NA
R
mean(heights, na.rm = TRUE)
SORTIE
[1] 4
R
max(heights, na.rm = TRUE)
SORTIE
[1] 6
Si vos données incluent des valeurs manquantes, vous souhaiterez
peut-être vous familiariser avec les fonctions is.na()
,
na.omit()
et complete.cases()
. Voir ci-dessous
pour des exemples.
R
## Extract those elements which are not missing values.
heights[!is.na(heights)]
SORTIE
[1] 2 4 4 6
R
## Returns the object with incomplete cases removed.
## The returned object is an atomic vector of type `"numeric"`
## (or `"double"`).
na.omit(heights)
SORTIE
[1] 2 4 4 6
attr(,"na.action")
[1] 4
attr(,"class")
[1] "omit"
R
## Extract those elements which are complete cases.
## The returned object is an atomic vector of type `"numeric"`
## (or `"double"`).
heights[complete.cases(heights)]
SORTIE
[1] 2 4 4 6
Défi:
- En utilisant ce vecteur de hauteurs en pouces, créez un nouveau vecteur en supprimant les NA.
R
heights <- c(63, 69, 60, 65, NA, 68, 61, 70, 61, 59, 64, 69, 63, 63, NA, 72, 65, 64, 70, 63, 65)
- Utilisez la fonction
median()
pour calculer la médiane du vecteurheights
. - Utilisez R pour déterminer combien de personnes dans l’ensemble mesurent plus de 67 pouces.
R
heights_no_na <- heights[!is.na(heights)]
## or
heights_no_na <- na.omit(heights)
R
median(heights, na.rm = TRUE)
SORTIE
[1] 64
R
heights_above_67 <- heights_no_na[heights_no_na > 67]
length(heights_above_67)
SORTIE
[1] 6
Génération de vecteurs
Constructeurs
Il existe quelques fonctions pour générer des vecteurs de différents
types. Pour générer un vecteur de valeurs numériques, on peut utiliser
le constructeur numeric()
, fournissant la longueur du
vecteur de sortie comme paramètre . Les valeurs seront initialisées à
0.
R
numeric(3)
SORTIE
[1] 0 0 0
R
numeric(10)
SORTIE
[1] 0 0 0 0 0 0 0 0 0 0
Notez que si l’on demande un vecteur de numériques de longueur 0, on obtient exactement cela :
R
numeric(0)
SORTIE
numeric(0)
Il existe des constructeurs similaires pour les caractères et les
logiques, nommés respectivement character()
et
logical()
.
R
character(2) ## the empty character
SORTIE
[1] "" ""
R
logical(2) ## FALSE
SORTIE
[1] FALSE FALSE
Répliquer des éléments
La fonction rep
permet de répéter une valeur un certain
nombre de fois. Si nous voulons initier un vecteur de numériques de
longueur 5 avec la valeur -1, par exemple, nous pourrions faire ce qui
suit :
R
rep(-1, 5)
SORTIE
[1] -1 -1 -1 -1 -1
De même, pour générer un vecteur rempli de valeurs manquantes, ce qui est souvent une bonne façon de commencer, sans poser d’hypothèses sur les données à collecter :
R
rep(NA, 5)
SORTIE
[1] NA NA NA NA NA
rep
peut prendre en entrée des vecteurs de n’importe
quelle longueur (ci-dessus, nous avons utilisé des vecteurs de longueur
1) et de n’importe quel type. Par exemple, si nous voulons répéter cinq
fois les valeurs 1, 2 et 3, nous procéderions comme suit :
R
rep(c(1, 2, 3), 5)
SORTIE
[1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
R
rep(c(1, 2, 3), each = 5)
SORTIE
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
R
sort(rep(c(1, 2, 3), 5))
SORTIE
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Génération de séquence
Une autre fonction très utile est seq
, pour générer une
séquence de nombres. Par exemple, pour générer une séquence d’entiers de
1 à 20 par pas de 2, on utiliserait :
R
seq(from = 1, to = 20, by = 2)
SORTIE
[1] 1 3 5 7 9 11 13 15 17 19
La valeur par défaut de by
est 1 et, étant donné que la
génération d’une séquence d’une valeur à une autre avec des pas de 1 est
fréquemment utilisée, il existe un raccourci :
R
seq(1, 5, 1)
SORTIE
[1] 1 2 3 4 5
R
seq(1, 5) ## default by
SORTIE
[1] 1 2 3 4 5
R
1:5
SORTIE
[1] 1 2 3 4 5
Pour générer une séquence de nombres de 1 à 20 de longueur finale de 3, on utiliserait :
R
seq(from = 1, to = 20, length.out = 3)
SORTIE
[1] 1.0 10.5 20.0
Échantillons aléatoires et permutations
Un dernier groupe de fonctions utiles sont celles qui génèrent des
données aléatoires . Le premier, sample
, génère une
permutation aléatoire de un autre vecteur. Par exemple, pour tirer au
sort un ordre aléatoire de 10 étudiants à l’examen oral, j’attribue
d’abord à chaque étudiant un numéro de 1 à dix (par exemple en fonction
de l’ordre alphabétique de son nom) puis :
R
sample(1:10)
SORTIE
[1] 9 4 7 1 2 5 3 10 6 8
Sans autres arguments, sample
renverra une permutation
de tous les éléments du vecteur. Si je veux un échantillon aléatoire
d’une certaine taille, je définirais cette valeur comme deuxième
argument. Ci-dessous, j’échantillonne 5 lettres aléatoires de l’alphabet
contenu dans le vecteur letters
prédéfini :
R
sample(letters, 5)
SORTIE
[1] "s" "a" "u" "x" "j"
Si je voulais une sortie plus grande que le vecteur d’entrée, ou
pouvoir dessiner certains éléments plusieurs fois, je devrais définir
l’argument replace
sur TRUE
:
R
sample(1:5, 10, replace = TRUE)
SORTIE
[1] 2 1 5 5 1 1 5 5 2 2
Défi:
En essayant les fonctions ci-dessus, vous aurez réalisé que les
échantillons sont effectivement aléatoires et qu’on n’obtient pas deux
fois la même permutation . Pour pouvoir reproduire ces tirages
aléatoires, on peut définir manuellement la graine de génération de
nombres aléatoires avec set.seed()
avant de tirer
l’échantillon aléatoire.
Testez cette fonctionnalité avec votre voisin. Dessinez d’abord deux permutations aléatoires de « 1:10 » indépendamment et observez que vous obtenez résultats différents.
Définissez maintenant la graine avec, par exemple,
set.seed(123)
et répétez le tirage au sort . Observez que
vous obtenez désormais les mêmes tirages au sort.
Répétez en définissant une graine différente.
Différentes permutations
R
sample(1:10)
SORTIE
[1] 9 1 4 3 6 2 5 8 10 7
R
sample(1:10)
SORTIE
[1] 4 9 7 6 1 10 8 3 2 5
Mêmes permutations avec la graine 123
R
set.seed(123)
sample(1:10)
SORTIE
[1] 3 10 2 8 6 9 1 7 5 4
R
set.seed(123)
sample(1:10)
SORTIE
[1] 3 10 2 8 6 9 1 7 5 4
Une graine différente
R
set.seed(1)
sample(1:10)
SORTIE
[1] 9 4 7 1 2 5 3 10 6 8
R
set.seed(1)
sample(1:10)
SORTIE
[1] 9 4 7 1 2 5 3 10 6 8
Extraire des échantillons à partir d’une distribution normale
La dernière fonction que nous allons voir est rnorm
, qui
tire un échantillon aléatoire à partir d’une distribution normale. Deux
distributions normales de moyennes 0 et 100 et d’écarts types 1 et 5,
notées N(0, 1) et N(100, 5), sont présentées
ci-dessous.

Les trois arguments, n
, mean
et
sd
, définissent la taille de l’échantillon , et les
paramètres de la distribution normale, c’est-à-dire la moyenne et son
écart type. Les valeurs par défaut de ce dernier sont 0 et 1.
R
rnorm(5)
SORTIE
[1] 0.69641761 0.05351568 -1.31028350 -2.12306606 -0.20807859
R
rnorm(5, 2, 2)
SORTIE
[1] 1.3744268 -0.1164714 2.8344472 1.3690969 3.6510983
R
rnorm(5, 100, 5)
SORTIE
[1] 106.45636 96.87448 95.62427 100.71678 107.12595
Maintenant que nous avons appris à écrire des scripts et les bases des structures de données de R, nous sommes prêts à commencer à travailler avec des données plus volumineuses et à en apprendre davantage sur les trames de données.