Introduction à R

Last updated on 2026-11-07 | Edit this page

Estimated time: 120 minutes

Overview

Questions

  • Premières commandes en R

Objectives

  • Définissez les termes suivants en lien avec R : objet, affecter, appeler, fonction, arguments, options.
  • Attribuer des valeurs à des objets dans R.
  • Apprendre à nommer des objets
  • Utiliser des commentaires pour éclairer le script.
  • Résoudre des opérations arithmétiques simples dans R.
  • Appeler des fonctions et utiliser des arguments pour modifier leurs options par défaut.
  • Examiner le contenu des vecteurs et en manipuler le contenu.
  • Sélectionner des sous-ensembles de vecteurs et en extraire des valeurs.
  • Analyser des vecteurs contenant des données manquantes.

Cet épisode est basé sur la leçon Data Analysis and Visualisation in R for Ecologists de Data Carpentries.

Création d’objets dans R


Vous pouvez obtenir des résultats depuis R en saisissant simplement des expressions mathématiques dans la console :

R

3 + 5

OUTPUT

[1] 8

R

12 / 7

OUTPUT

[1] 1.714286

Cependant, pour faire des choses utiles et intéressantes, nous devons affecter des valeurs à des objets. Pour créer un objet, nous devons lui donner un nom suivi de l’opérateur d’affectation <-, puis de la valeur que nous souhaitons lui affecter :

R

weight_kg <- 55

<- est l’opérateur d’affectation. Il attribue des valeurs à droite à des objets à gauche. Ainsi, après avoir exécuté x <- 3, la valeur de x est 3. La flèche peut être lue comme 3 va dans x. Pour des raisons historiques, vous pouvez également utiliser = pour les affectations, mais pas dans tous les contextes. En raison des légères différences de syntaxe, il est recommandé d’utiliser toujours <- pour les affectations.

Dans RStudio, saisir Alt + - (appuyer sur Alt en même temps que la touche -) permet d’écrire <- en un seul coup de touche sur un PC, tandis que saisir Option + - (appuyer sur Option en même temps que la touche -) fait de même sur un Mac.

Nommer les variables

Les objets peuvent porter n’importe quel nom, tel que x, current_temperature ou subject_id. Il convient que les noms de vos objets soient explicites et pas trop longs. Ils ne peuvent pas commencer par un chiffre (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 correspondent aux noms de fonctions fondamentales de R (par exemple, if, else, for ; voir la page du manuel Reserved Words in R pour une liste complète). En général, même si c’est autorisé, il est préférable de ne pas utiliser les noms d’autres fonctions (par exemple, c, T, mean, data, df, weights). 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 (.) au sein du nom d’un objet, comme dans my.dataset. De nombreuses fonctions en R contiennent des points dans leur nom pour des raisons historiques, mais comme les points ont une signification spéciale en R (pour les méthodes) et dans d’autres langages de programmation, il est préférable de les éviter. Il est également recommandé d’utiliser des noms communs pour les objets et des verbes pour les fonctions. Il est important d’être cohérent dans la mise en forme de votre code (l’endroit où vous placez les espaces, la manière dont vous nommez les objets, etc.). L’utilisation d’un style de codage cohérent rend votre code plus lisible pour vous-même à l’avenir et pour vos collaborateurs. En R, certains guides de style populaires sont celui de Google, le style de tidyverse et le guide de style de Bioconductor. Celui de tidyverse est très complet et peut sembler accablant au début. Vous pouvez installer le package lintr pour vérifier automatiquement les problèmes de mise en forme de votre code.

Objets vs. variables : Ce que l’on appelle objects dans R est appelé variables dans de nombreux autres langages de programmation. Selon le contexte, object et variable peuvent avoir des significations radicalement différentes. Cependant, dans cette leçon, les deux termes sont utilisés comme des synonymes. Pour plus d’informations, voir ici.

Lorsqu’on attribue une valeur à un objet, R n’affiche rien. Vous pouvez forcer R à afficher la valeur en utilisant des parenthèses ou en saisissant le nom de l’objet :

R

weight_kg <- 55    # doesn't print anything
(weight_kg <- 55)  # but putting parenthesis around the call prints the value of `weight_kg`

OUTPUT

[1] 55

R

weight_kg          # and so does typing the name of the object

OUTPUT

[1] 55

Maintenant que R a weight_kg en mémoire, nous pouvons effectuer des opérations arithmétiques avec celui-ci. Par exemple, nous souhaiterions peut-être convertir ce poids en livres (le poids en livres est 2,2 fois le poids en kg) :

R

2.2 * weight_kg

OUTPUT

[1] 121

Nous pouvons également modifier la valeur d’un objet en lui attribuant une nouvelle valeur :

R

weight_kg <- 57.5
2.2 * weight_kg

OUTPUT

[1] 126.5

Cela signifie que l’attribution d’une valeur à un objet ne modifie pas les valeurs des 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 modifier weight_kg en 100.

R

weight_kg <- 100
Discussion

Défi :

Selon vous, quel est le contenu actuel de l’objet weight_lb ? 126.5 ou 220 ?

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 de décommenter facilement un paragraphe : après avoir sélectionné les lignes que vous souhaitez commenter, appuyez simultanément sur Ctrl + Shift + C sur votre clavier. Si vous ne souhaitez commenter qu’une seule ligne, vous pouvez placer le curseur n’importe où sur cette ligne (c’est-à-dire qu’il n’est pas nécessaire de sélectionner l’intégralité de la ligne), puis appuyer sur Ctrl + Shift + C.

Discussion

Défi

Quelles sont les valeurs après chaque instruction dans ce qui suit ?

R

mass <- 47.5            # mass?
age  <- 122             # age?
mass <- mass * 2.0      # mass?
age  <- age - 20        # age?
mass_index <- mass/age  # mass_index?

Fonctions et leurs arguments


Les fonctions sont des « scripts préparés » qui automatisent des ensembles de commandes plus complexes, notamment des opérations d’affectation, etc. De nombreuses fonctions sont prédéfinies, ou peuvent être rendues disponibles en important des packages R (on en reparlera plus tard). Une fonction reçoit généralement un ou plusieurs paramètres appelés arguments. Les fonctions renvoient souvent (mais pas toujours) une valeur. Un exemple type 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. L’exécution d’une fonction (« son lancement ») est appelée appel de la fonction. Un exemple d’appel de fonction est :

R

b <- sqrt(a)

Ici, la valeur de a est transmise à la fonction sqrt(), la fonction sqrt() calcule la racine carrée et renvoie la valeur qui est ensuite affectée à l’objet b. Cette fonction est très simple, car elle ne prend qu’un seul argument.

La « valeur » de retour d’une fonction n’a pas nécessairement besoin d’être numérique (comme celle de sqrt()), et elle n’a pas non plus besoin d’être un seul élément : elle peut être un ensemble d’éléments, voire un jeu de données. Nous verrons cela lorsque nous lirons des fichiers de données dans R.

Les arguments peuvent être n’importe quoi, et non seulement des nombres ou des noms de fichiers, mais aussi d’autres objets. La signification exacte de chaque argument varie selon la fonction et doit être consultée dans la documentation (voir ci-dessous). Certaines fonctions acceptent des arguments qui peuvent être spécifiés par l’utilisateur ou, s’ils sont omis, prendre une valeur par défaut : ceux-ci sont appelés options. Les options sont généralement utilisées pour modifier le mode de fonctionnement de la fonction, par exemple pour déterminer si elle ignore les « valeurs erronées » ou quel symbole utiliser dans un graphique. 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 capable de prendre plusieurs arguments : round().

R

round(3.14159)

OUTPUT

[1] 3

Ici, nous avons appelé round() avec un seul argument, 3.14159, et celui-ci a renvoyé la valeur 3. C’est parce que la valeur par défaut consiste à arrondir au nombre entier le plus proche. Si nous souhaitons obtenir plus de chiffres, nous pouvons voir comment faire en obtenant des informations sur la fonction round. Nous pouvons utiliser args(round) ou consulter l’aide de cette fonction via ?round.

R

args(round)

OUTPUT

function (x, digits = 0, ...)
NULL

R

?round

On voit que si l’on souhaite un nombre de chiffres différent, on peut saisir digits=2 ou le nombre souhaité.

R

round(3.14159, digits = 2)

OUTPUT

[1] 3.14

Si vous fournissez les arguments exactement dans le même ordre que celui utilisé pour leur définition, vous n’avez pas besoin de les nommer :

R

round(3.14159, 2)

OUTPUT

[1] 3.14

Et si vous nommez les arguments, vous pouvez en changer l’ordre :

R

round(digits = 2, x = 3.14159)

OUTPUT

[1] 3.14

Il est recommandé de placer les arguments obligatoires (comme le nombre que vous arrondissez) en premier dans votre appel de fonction, et de spécifier le nom de tous les arguments optionnels. Sinon, quelqu’un lisant votre code pourrait devoir consulter la définition d’une fonction présentant des arguments inconnus pour comprendre ce que vous faites. En spécifiant le nom des arguments, vous vous préservez également contre d’éventuels changements futurs de l’interface de la fonction, qui pourraient 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 constitue pratiquement l’outil de base de R. Un vecteur est composé d’une série de valeurs, telles que des nombres ou des caractères. Nous pouvons attribuer une série de valeurs à un vecteur à l’aide de 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

OUTPUT

[1] 50 60 65 82

Un vecteur peut également contenir des caractères :

R

molecules <- c("dna", "rna", "protein")
molecules

OUTPUT

[1] "dna"     "rna"     "protein"

Les guillemets autour de « dna », « rna », etc., sont indispensables ici. Sans les guillemets, R supposera qu’il existe des objets nommés dna, rna et protein. Comme ces objets n’existent pas dans la mémoire de R, un message d’erreur s’affichera.

Il existe de nombreuses fonctions qui vous permettent d’examiner le contenu d’un vecteur. length() vous indique combien d’éléments se trouvent dans un vecteur particulier :

R

length(weight_g)

OUTPUT

[1] 4

R

length(molecules)

OUTPUT

[1] 3

Une caractéristique importante d’un vecteur est que tous ses é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)

OUTPUT

[1] "numeric"

R

class(molecules)

OUTPUT

[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 l’on travaille avec des objets volumineux et complexes :

R

str(weight_g)

OUTPUT

 num [1:4] 50 60 65 82

R

str(molecules)

OUTPUT

 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

OUTPUT

[1] 30 50 60 65 82 90

Dans la première ligne, nous prenons le vecteur d’origine weight_g, ajoutons la valeur 90 à sa fin et enregistrons le résultat dans weight_g. Ensuite, nous ajoutons la valeur 30 au début, enregistrant à nouveau le résultat dans weight_g.

Nous pouvons répéter cette opération à plusieurs reprises pour agrandir un vecteur ou assembler un jeu de données. Lors de la programmation, cela peut s’avérer utile pour ajouter des résultats que nous recueillons ou calculons.

Un vecteur atomique est le type de données R le plus simple et constitue un vecteur linéaire d’un seul type. Plus haut, nous avons vu 2 des 6 principaux types de vecteurs atomiques utilisés par R : "character" et "numeric" (ou "double"). Ce sont les éléments de base à partir desquels sont construits tous les objets R. Les 4 autres types de vecteurs atomiques sont :

  • "logical" pour TRUE et FALSE (le type de données booléen)
  • "integer" pour les nombres entiers (par ex., 2L, le L indique à R qu’il s’agit d’un nombre entier)
  • "complex" pour représenter des nombres complexes avec partie réelle et partie imaginaire (par ex., 1 + 4i) et c’est tout ce que nous allons dire à leur sujet
  • "raw" pour les flux binaires 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. Parmi les autres structures importantes figurent les listes (list), les matrices (matrix), les tableaux de données (data.frame), les facteurs (factor) et les tableaux (array).

Challenge

Défi :

Nous avons vu que les vecteurs atomiques peuvent être de type caractère, numérique (ou double), entier et logique. Mais qu’arrive-t-il si nous essayons de mélanger ces types dans un seul vecteur ?

R les convertit implicitement tous au même type

Challenge

Défi :

Qu’arrivera-t-il dans chacun de ces exemples ? (indice : utilisez class() pour vérifier le type de données de vos objets et saisissez 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)

OUTPUT

[1] "character"

R

num_char

OUTPUT

[1] "1" "2" "3" "a"

R

class(num_logical)

OUTPUT

[1] "numeric"

R

num_logical

OUTPUT

[1] 1 2 3 1 0

R

class(char_logical)

OUTPUT

[1] "character"

R

char_logical

OUTPUT

[1] "a"    "b"    "c"    "TRUE"

R

class(tricky)

OUTPUT

[1] "character"

R

tricky

OUTPUT

[1] "1" "2" "3" "4"
Challenge

Défi :

Pourquoi pensez-vous que cela se produit ?

Les vecteurs ne peuvent contenir qu’un seul type de données. R tente de convertir le contenu de ce vecteur afin de trouver un dénominateur commun qui ne perde aucune information.

Challenge

Défi :

Combien de valeurs dans combined_logical sont "TRUE" (en tant que caractère) dans l’exemple suivant :

R

num_logical <- c(1, 2, 3, TRUE)
char_logical <- c("a", "b", "c", TRUE)
combined_logical <- c(num_logical, char_logical)

Un seul. Il n’y a aucune mémoire des types de données antérieurs, et la coercition s’effectue 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

OUTPUT

[1] "1"    "2"    "3"    "1"    "a"    "b"    "c"    "TRUE"
Challenge

Défi :

En R, nous appelons coercion la conversion d’objets d’une classe à une autre. Ces conversions s’effectuent selon une hiérarchie, selon laquelle certains types sont prioritairement convertis en d’autres. Pouvez-vous tracer un schéma représentant la hiérarchie de la manière dont ces types de données sont convertis ?

logique → numérique → caractère ← logique

Extraction de sous-ensembles de vecteurs


Si nous souhaitons extraire une ou plusieurs valeurs d’un vecteur, nous devons fournir un ou plusieurs indices entre crochets. Par exemple :

R

molecules <- c("dna", "rna", "peptide", "protein")
molecules[2]

OUTPUT

[1] "rna"

R

molecules[c(3, 2)]

OUTPUT

[1] "peptide" "rna"    

Nous pouvons également répéter les indices pour créer un objet comportant plus d’éléments que l’original :

R

more_molecules <- molecules[c(1, 2, 3, 2, 1, 4)]
more_molecules

OUTPUT

[1] "dna"     "rna"     "peptide" "rna"     "dna"     "protein"

Les indices en R commencent à 1. Les langages de programmation tels que Fortran, MATLAB, Julia et R commencent à compter à partir de 1, car c’est ainsi que les êtres humains le font habituellement. Les langages de la famille C (y compris C++, Java, Perl et Python) comptent à partir de 0, car c’est plus simple pour les ordinateurs.

Enfin, il est également possible d’obtenir tous les éléments d’un vecteur, à l’exception de certains éléments spécifiés, en utilisant des indices négatifs :

R

molecules ## all molecules

OUTPUT

[1] "dna"     "rna"     "peptide" "protein"

R

molecules[-1] ## all but the first one

OUTPUT

[1] "rna"     "peptide" "protein"

R

molecules[-c(1, 3)] ## all but 1st/3rd ones

OUTPUT

[1] "rna"     "protein"

R

molecules[c(-1, -3)] ## all but 1st/3rd ones

OUTPUT

[1] "rna"     "protein"

Sélection conditionnelle d’éléments


Une autre façon courante de sélectionner un sous-ensemble consiste à utiliser un vecteur logique. TRUE sélectionnera l’élément ayant le même indice, tandis que FALSE ne le sélectionnera pas :

R

weight_g <- c(21, 34, 39, 54, 55)
weight_g[c(TRUE, FALSE, TRUE, TRUE, FALSE)]

OUTPUT

[1] 21 39 54

En général, ces vecteurs logiques ne sont pas saisis manuellement, mais sont le résultat d’autres fonctions ou de tests logiques. Par exemple, si vous souhaitiez sélectionner uniquement les valeurs supérieures à 50 :

R

## will return logicals with TRUE for the indices that meet
## the condition
weight_g > 50

OUTPUT

[1] FALSE FALSE FALSE  TRUE  TRUE

R

## so we can use this to select only the values above 50
weight_g[weight_g > 50]

OUTPUT

[1] 54 55

Vous pouvez combiner plusieurs tests à l’aide de & (les deux conditions sont vraies, ET) ou de | (au moins l’une des conditions est vraie, OU) :

R

weight_g[weight_g < 30 | weight_g > 50]

OUTPUT

[1] 21 54 55

R

weight_g[weight_g >= 30 & weight_g == 21]

OUTPUT

numeric(0)

Ici, < désigne « inférieur à », > « supérieur à », >= « supérieur ou égal à » et == « égal à ». Le double signe égal == est une opération de vérification de l’égalité numérique entre le membre de gauche et celui de droite, et ne doit pas être confondu avec le signe unique =, qui effectue l’affectation d’une variable (à l’instar de <-).

Une tâche courante consiste à rechercher certaines chaînes de caractères dans un vecteur. On pourrait utiliser l’opérateur « ou » | pour vérifier l’égalité avec plusieurs valeurs, mais cela peut rapidement devenir fastidieux. La fonction %in% permet de vérifier 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

OUTPUT

[1] "dna" "rna"

R

molecules %in% c("rna", "dna", "metabolite", "peptide", "glycerol")

OUTPUT

[1]  TRUE  TRUE FALSE  TRUE

R

molecules[molecules %in% c("rna", "dna", "metabolite", "peptide", "glycerol")]

OUTPUT

[1] "dna"     "rna"     "peptide"
Challenge

Défi :

Parvenez-vous à comprendre pourquoi "four" > "five" renvoie TRUE ?

R

"four" > "five"

OUTPUT

[1] TRUE

Lorsqu’on utilise > ou < sur des chaînes de caractères, R compare leur ordre alphabétique. Ici, "four" vient après "five" et lui est donc supérieur.

Noms


Il est possible de nommer chaque élément d’un vecteur. Le bloc de code ci-dessous montre un vecteur initial sans aucun nom, ainsi que la manière dont les noms sont définis et récupérés.

R

x <- c(1, 5, 3, 5, 10)
names(x) ## no names

OUTPUT

NULL

R

names(x) <- c("A", "B", "C", "D", "E")
names(x) ## now we have names

OUTPUT

[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)]

OUTPUT

A C
1 3 

R

x[c("A", "C")]

OUTPUT

A C
1 3 

Données manquantes


Comme R a été conçu pour analyser des jeux 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 renvoient NA si les données avec lesquelles vous travaillez contiennent des valeurs manquantes. Cette fonctionnalité rend plus difficile le fait de négliger les cas où vous manipulez des données manquantes. Vous pouvez ajouter l’argument na.rm = TRUE pour calculer le résultat tout en ignorant les valeurs manquantes.

R

heights <- c(2, 4, 4, NA, 6)
mean(heights)

OUTPUT

[1] NA

R

max(heights)

OUTPUT

[1] NA

R

mean(heights, na.rm = TRUE)

OUTPUT

[1] 4

R

max(heights, na.rm = TRUE)

OUTPUT

[1] 6

Si vos données contiennent des valeurs manquantes, vous souhaiterez peut-être vous familiariser avec les fonctions is.na(), na.omit() et complete.cases(). Consultez les exemples ci-dessous.

R

## Extract those elements which are not missing values.
heights[!is.na(heights)]

OUTPUT

[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)

OUTPUT

[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)]

OUTPUT

[1] 2 4 4 6
Challenge

Défi :

  1. À l’aide de ce vecteur de tailles en pouces, créez un nouveau vecteur dont les valeurs NA ont été supprimées.

R

heights <- c(63, 69, 60, 65, NA, 68, 61, 70, 61, 59, 64, 69, 63, 63, NA, 72, 65, 64, 70, 63, 65)
  1. Utilisez la fonction median() pour calculer la médiane du vecteur heights.
  2. 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)

OUTPUT

[1] 64

R

heights_above_67 <- heights_no_na[heights_no_na > 67]
length(heights_above_67)

OUTPUT

[1] 6

Génération de vecteurs


Constructeurs

Il existe plusieurs fonctions permettant de générer des vecteurs de différents types. Pour générer un vecteur de nombres, on peut utiliser le constructeur numeric(), en fournissant la longueur du vecteur de sortie comme paramètre. Les valeurs seront initialisées à 0.

R

numeric(3)

OUTPUT

[1] 0 0 0

R

numeric(10)

OUTPUT

 [1] 0 0 0 0 0 0 0 0 0 0

Notons que si nous demandons un vecteur numérique de longueur 0, nous obtenons exactement cela :

R

numeric(0)

OUTPUT

numeric(0)

Il existe des constructeurs similaires pour les caractères et les valeurs logiques, nommés respectivement character() et logical().

Challenge

Défi :

Quelles sont les valeurs par défaut pour les vecteurs de caractères et logiques ?

R

character(2) ## the empty character

OUTPUT

[1] "" ""

R

logical(2)   ## FALSE

OUTPUT

[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 souhaitons initialiser un vecteur numérique de longueur 5 avec la valeur -1, par exemple, nous pourrions procéder comme suit :

R

rep(-1, 5)

OUTPUT

[1] -1 -1 -1 -1 -1

De même, pour générer un vecteur rempli de valeurs manquantes, ce qui constitue souvent un bon point de départ, sans formuler d’hypothèses sur les données à collecter :

R

rep(NA, 5)

OUTPUT

[1] NA NA NA NA NA

rep peut accepter en entrée des vecteurs de longueur quelconque (ci-dessus, nous avons utilisé des vecteurs de longueur 1) et de tout type. Par exemple, si nous voulons répéter les valeurs 1, 2 et 3 cinq fois, nous procéderions comme suit :

R

rep(c(1, 2, 3), 5)

OUTPUT

 [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
Challenge

Défi :

Et si nous voulions répéter les valeurs 1, 2 et 3 cinq fois, mais obtenir cinq 1, cinq 2 et cinq 3 dans cet ordre ? Il existe deux possibilités — consultez ?rep ou ?sort pour obtenir de l’aide.

R

rep(c(1, 2, 3), each = 5)

OUTPUT

 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3

R

sort(rep(c(1, 2, 3), 5))

OUTPUT

 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3

Génération de séquences

Une autre fonction très utile est seq, pour générer une suite de nombres. Par exemple, pour générer une suite d’entiers de 1 à 20 par paliers de 2, on utiliserait :

R

seq(from = 1, to = 20, by = 2)

OUTPUT

 [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 suite allant d’une valeur à une autre par paliers de 1 est fréquemment utilisée, il existe un raccourci :

R

seq(1, 5, 1)

OUTPUT

[1] 1 2 3 4 5

R

seq(1, 5) ## default by

OUTPUT

[1] 1 2 3 4 5

R

1:5

OUTPUT

[1] 1 2 3 4 5

Pour générer une suite de nombres de 1 à 20 d’une longueur finale de 3, on utiliserait :

R

seq(from = 1, to = 20, length.out = 3)

OUTPUT

[1]  1.0 10.5 20.0

Échantillons aléatoires et permutations

Un dernier groupe de fonctions utiles consiste à génèrer des données aléatoires. La première, sample, génère une permutation aléatoire d’un autre vecteur. Par exemple, pour établir un ordre aléatoire pour l’examen oral de 10 étudiants, j’attribue d’abord à chaque étudiant un numéro de 1 à 10 (par exemple, selon l’ordre alphabétique de son nom) puis :

R

sample(1:10)

OUTPUT

 [1]  9  4  7  1  2  5  3 10  6  8

Sans arguments supplémentaires, sample renvoie une permutation de tous les éléments du vecteur. Si je souhaite un échantillon aléatoire d’une certaine taille, je définirais cette valeur comme second argument. Ci-dessous, je tire 5 lettres aléatoires de l’alphabet contenu dans le vecteur letters prédéfini :

R

sample(letters, 5)

OUTPUT

[1] "s" "a" "u" "x" "j"

Si je souhaitais obtenir un échantillon plus long que le vecteur d’entrée, ou pouvoir tirer certains éléments plusieurs fois, je devrais fixer l’argument replace à TRUE :

R

sample(1:5, 10, replace = TRUE)

OUTPUT

 [1] 2 1 5 5 1 1 5 5 2 2
Challenge

Défi :

En essayant les fonctions ci-dessus, vous aurez constaté que les échantillons sont effectivement aléatoires et qu’on n’obtient pas la même permutation deux fois. 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. Tirez d’abord deux permutations aléatoires de 1:10 indépendamment et observez que vous obtenez des résultats différents.

Définissez maintenant la graine avec, par exemple, set.seed(123) et répétez l’échantillonnage aléatoire. Observez que vous obtenez désormais les mêmes échantillonnages aléatoires.

Répétez l’opération en définissant une graine différente.

Différentes permutations

R

sample(1:10)

OUTPUT

 [1]  9  1  4  3  6  2  5  8 10  7

R

sample(1:10)

OUTPUT

 [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)

OUTPUT

 [1]  3 10  2  8  6  9  1  7  5  4

R

set.seed(123)
sample(1:10)

OUTPUT

 [1]  3 10  2  8  6  9  1  7  5  4

Une graine différente

R

set.seed(1)
sample(1:10)

OUTPUT

 [1]  9  4  7  1  2  5  3 10  6  8

R

set.seed(1)
sample(1:10)

OUTPUT

 [1]  9  4  7  1  2  5  3 10  6  8

Tirage d’échantillons à partir d’une distribution normale

La dernière fonction que nous allons voir est rnorm, qui tire un échantillon aléatoire d’une distribution normale. Deux distributions normales dont les moyennes sont 0 et 100 et les écarts-types 1 et 5, notées N(0, 1) et N(100, 5), sont illustrées ci-dessous.

Two figures illustraing normal distributonis N(0,1) and N(100,5).
Two normal distributions: N(0, 1) on the left and N(100, 5) on the right.

Les trois arguments, n, mean et sd, définissent la taille de l’échantillon ainsi que les paramètres de la distribution normale, à savoir sa moyenne et son écart-type. Les valeurs par défaut de la moyenne et de l’écart-type sont respectivement 0 et 1.

R

rnorm(5)

OUTPUT

[1]  0.69641761  0.05351568 -1.31028350 -2.12306606 -0.20807859

R

rnorm(5, 2, 2)

OUTPUT

[1]  1.3744268 -0.1164714  2.8344472  1.3690969  3.6510983

R

rnorm(5, 100, 5)

OUTPUT

[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 à découvrir les tableaux de données.

Key Points
  • Comment interagir avec R