2.3 Vecteurs, types atomiques
Au chapitre précédent, nous avons vu comment manipuler des nombres à l'aide d'expressions et comment affecter le résultat de nos calculs à des variables. En réalité, nous avons un peu simplifié les choses : la véritable structure de données derière les nombres en R est les vecteurs. Les nombres que nous avons manipulés sont simplement des vecteurs de nombres de dimension 1.
Un vecteur en R peut-être vu comme une collection d'éléments de même nature. Il existe 6 types dit "simples" ou "atomiques", qui représentent des données de différentes natures. Ces types sont dit atomiques car ils sont les élements "de base" de R, ils représentent les donnés les plus simples possibles. Nous avons vu les trois premiers types dans les chapitres précédents, qui représentent les nombres :
- Le type
integer
pour représenter les nombres entiers comme-1L
ou4L
. - Le type
double
pour représenter les nombres réels comme3
ou3.14
. - le type
complex
pour représenter les nombres complexes comme2+4i
.
Les trois types atomiques restant sont :
- Le type
character
qui représentent les chaines de charactére, comme"Bonjour"
. - Le type
logical
qui représentent soit vrai soit faux, ainsi que les données manquantes avecNA
. - Le type
raw
qui représente des chaines binaires, c'est à dire une suite de 0 et de 1.
Nous allons voir tous les types atomiques dans ce chapitre, sauf le dernier type raw
. Il sert uniquement à manipuler directement les chaines bytes (suite de 0 et de 1), ce qui en pratique est un usage rare et avancé, qui sort du cadre de ce cours. Nous ferons donc comme si il n'existait que 5 types atomiques, le 6éme type raw
ne nous intéressant pas.
Il existe également d'autres types de données que les 6 types atomiques (5 si on ne compte pas raw
), mais nous les découvrirons plus tard au fil du cours. Pour le moment, concentrons nous sur les 5 types atomiques qui nous intéressent.
Les vecteurs de nombres ou les types integer, double et complex :
Commençons notre découverte des vecteurs atomiques avec les vecteurs de nombres, que nous connaissons déjà un peu. Voici comment déclarer un vecteur en R : il suffit d'utiliser la fonction c()
comme "combine", qui nous indique de combiner différents éléments dans un même vecteur. Il suffit alors de séparer les différents élèments du vecteur par une ,
.
#Déclarons un vecteur de doubles et affectons le à une variable
mon_vecteur = c(1,2,5)
Comme toute variable, on peut afficher le contenu de notre vecteur dans la console avec la fonction print()
(ou simplement en écrivant le nom du vecteur) :
print(monVecteur) #affiche notre vecteur
mon_vecteur #fait la même chose
Ici nous avons crée un vecteur de dimension 3, car il contient 3 éléments.
Tous les nombres que nous avons vu dans les chapitres précédents étaient en réalité des vecteurs à une dimension. Si votre vecteur posséde une seule dimension (il contient un seul élément) vous n'êtes pas obligé de l'écrire sous la forme c(25)
. Vous écrire le nombre directement comme nous l'avons fais jusqu'à maintenant.
#Un nombre est un vecteur à une dimension
a = c(25) #écriture explicite avec combine
b = 25 #ecriture implicite d'un vecteur à une dimension
L'écriture implicte étant plus courte, c'est celle qu'on utilisera à chaque fois quand cela est possible, on réservera la forme explicite uniquement pour écrire des vecteurs à plusieurs éléments.
Tous les élements d'un vecteur doivent être de même type
Un vecteur doit forcement contenir des élements qui sont tous du même type. Pour un vecteur de nombres cela signifie que tous les nombres doivent être soit des entiers, soit des complexes, soit des décimaux etc. Il n'est pas possible de créer un vecteur qui contienne des données de types différentes. Déclarons un vecteur de chaque type :
#On déclare un vecteur de nombres entiers
vect_entiers = c(1L, 3L, 5L, 7L)
#On déclare un vecteur de nombres décimaux
vect_decimaux = c(1.30, 4.45)
#On déclare un vecteur de nombres complexes
vect_complexe = c(2+1i, 4-4i, 2i)
Cette régle est très importante. Dans le chapitre suivant, nous verrons comment la "contourner" et ce qui se passe quand on essaye de créer un vecteurs dont tous les éléments ne sont pas de même type.
Les vecteurs de chaines de caractères ou le type character
La seconde catégorie de données que l'on peut manipuler avec R en dehors des nombres est les chaines de caractéres, de type character
. Pour déclarer un vecteur de chaine de caractére, il suffit d'écrire chaque chaine qui compose le vecteur entre doubles appostrophes ""
(on parle de double quote en anglais). Vous pouvez aussi utiliser l'appostrophe simple (simple quote) ''
à la place, les deux façons de faire sont identiques :
presidents = c("Washington", "Adams", "Jefferson")
presidents = c('Washington', 'Adams', 'Jefferson') #autre façon de faire
La plupart des gens préférent utiliser les guillemets ""
pour déclarer des chaines, nous allons donc les utiliser tout à long de ce cours.
Si le type "officiel" est bien character
, pour chaine de caractéres, il arrive souvent que l'on emploi le terme string
à la place, pour "string of characters". En pratique, on parlera aussi bien de strings que de chaines pour désigner les objets de ce type.
presidents = c("Washington", "Adams", "Jefferson")
typeof(presidents) #affiche "character"
Ccomme pour les vecteurs de nombres, il existe aussi une forme racourçi pour les vecteurs de chaines qui contiennent un seul élément :
premier_president = c("Washington") #forme classique
premier_president = "Washington" #forme racourçi
Là encore, on utilisera cette syntaxe dès que possible afin de rendre le code plus lisible et car elle est plus rapide à écrire.
Echaper un caractére
Votre chaine de caractére pour contenir n'importe quel séquence de caractéres (lettres, chiffres, espace, ponctuations etc), sauf la double appostrophe qui marque la fin de la chaine. Pour inclure une double appostrophe dans une chaine, vous devez indiquez à R que cette double appostrophe ne marque pas la fin de la chaine, en la faisant précéder d'un anti slash \
. On dit que le caractère suivant l'anti slash est "échappé".
citation = "\"Yes we can !\""
print(citation)
A l'affiche, R Studio va néanmoins afficher l'anti slash dans le résultat, comme vous pouvez le voir en exécutant la ligne de code précédente. La raison est que print()
affiche en réalité non pas la chaine de caractéres en tant que telle, mais sa représentation, qui comporte les \
. Si vous voulez afficher une chaine contenant des caractéres echappés sans que les \
apparaissent, il faut non pas utiliser print()
mais la fonction writeLines()
, comme ceci :
writeLines("Obama a utilisé : \"Yes we can !\" comme slogan pendant sa premiére campagne")
Une autre solution consiste simplement à utiliser des single quote quand vous voulez afficher une double quote dans votre chaine, et vise versa :
ma_chaine = "L'élection à été remportée par G. Washington"
print(maChaine)
Les vecteurs de boléens ou le type logical
Le dernier type primitif est le type logical
, que l'on appelle aussi courament bolean
. Un boléen peut prendre uniquement trois valeurs : TRUE
ou FALSE
et NA
, c'est à dire vrai ou faux, et NA
qui représente les données manquantes (Non Available). On déclare un vecteur de boléens exactement de la même façon que les autres :
vecteur_logical = c(TRUE, FALSE, TRUE, NA)
typeof(vecteur_logical) #logical
Faites bien attention à écrire TRUE
et FALSE
en majuscule, sinon cela ne fonctionnera pas. Comme pour les autres types de vecteurs, vous pouvez vous passer du c()
si votre vecteur contient un seul élément :
Washington_mort_assassine = c(FALSE) #forme explicite
Washington_mort_assassine = FALSE #forme implicite
F et T à la place de FALSE et TRUE
Il existe également une forme abrégée, qui est T
pour TRUE
et F
pour FALSE
:
vecteur_logical_abrege = c(T,F,T,T)
Néanmoins il est recommandé de ne pas utiliser cette syntaxe abregée, car elle n'est pas fiable. En effet, R authorise l'utilisateur à modifier F
et T
comme si c'étaient des variables. Alors ils ne correspondront plus à des bolléens mais à autre chose, et l'on risque de ne pas se retrouver avec un vecteur de bolléens comme attendu.
Les données manquantes avec NA
R étant un langage pour le calcul statistique, il prévoit naturellement la possibilité que certaines observations manquent dans un jeu de données. Pour représenter une observation non disponible, R utilise la valeur NA
, qui signifie "non available". Regardons un exemple :
age = NA
typeof(age) #boolean
On créer une variable age à laquelle on affecte la valeur NA
pour indiquer que cette variable existe mais que sa valeur nous est inconnue. Comme dit plus haut, NA
appartient de base au type logical
.
Mais NA
existe aussi dans tous les autres types : integer
, double
, complex
, character
. On peut ainsi toujours représenter des données manquantes dans un vecteur avec NA
, sans se poser la question du type. R va automatiquement utiliser le NA
du type de notre vecteur :
vect1 = c(1L,3L,NA) #Un vecteur d'entier avec une observation manquante
typeof(vect1) #integer
vect2 = c(2, 3.14, NA) #Un vecteur de doubles avec une observation manquante
typeof(vect2) #double
vect3 = c(2+1i, -3-2i, NA) #Un vecteur de complexes avec une observation manquante
typeof(vect3) #complex
vect4 = c("Washington", NA, NA) #Un vecteur de strings avec deux observations manquantes
typeof(vect4) #character
Cela est bien pratique, car on reconnaitra à chaque fois une donnée manquante par le fait qu'elle prenne la valeur NA
, sans se soucier de son type. Nous verrons dans le prochain chapitre que NA
s'adapte toujours et peut changer de type en même temps que votre vecteur.
La longeur d'un vecteur
Tout vecteur posséde une longeur, qui indique le nombre d'éléments que contient ce vecteur. Pour afficher la longueur d'un vecteur, il suffit d'appeler la fonction length()
et de lui indiquer le vecteur donc on souhaite connaitre la longueur :
vect_entiers = c(1L,3L,5L,7L)
length(vect_entiers ) #affiche 4
age = 25
length(age) #affiche 1
presidents = c("Washington", "Adams", "Jefferson")
length(presidents ) #affiche 3
vecteur_logical = c(TRUE, FALSE)
length(vecteur_logical) #affiche 2
Vous pouvez aussi remarquer que la longueur de vos vecteurs s'affiche dans la propriété length
de l'onglet environment
: Connaitre la longeur d'un vecteur est souvent utile, par exemple pour parcourir tous les élements du vecteur dans une boucle.
Nommer un vecteur
Il est parfois pratique de donner un nom aux éléments d'un vecteur, pour mieux visualiser à quoi correspond chaque valeur. Par exemple si vous regrouper les résultats d'une analyse statistique dans un vecteur, il peut être utile d'associer à chaque statistique son nom (moyenne, mediane, variance etc.).
Pour cela, on peut utiliser la fonction names()
qui récupére les noms d'un vecteur. Par défaut, un vecteur n'a pas de noms (names(vecteur)
affiche donc NULL
). Mais on peut affecter un vecteurs de chaines comme noms pour chaque élément, comme ceci :
statistiques = c(12, 15, 4)
names(statistiques) = c("Moyenne", "Mediane", "Variance")
print(statistiques)
On peut voir que grace aux noms qui s'affichent dans la console, la lecture des informations contenues dans le vecteur est bien plus simple pour nous ! Il est donc parfois intéressant de nommer vos éléments de vecteurs quand ils correspondent à quelque chose que vous voulez afficher dans la console.
A retenir :
- Il existe 6 types de vecteurs atomiques en R : trois pour représenter les nombres (
integer
,double
etcomplex
),character
qui représente les chaines de charactére,logical
pour représenter les valeurs VRAI ou FAUX. Et un dernier typeraw
pour représenter directement des chaines binaires de 0 et de 1 que nous ne voyons pas dans le cadre de ce cours. - On créer un vecteur en combinant ces différents élements avec la fonction
c()
pour "combine" de cette façon :c(1,2,3)
. - Si un vecteur comporte un seul élement, alors on peut l'écrire directement sans utiliser combine :
age = 25
. - On peut représenter les données manquantes avec
NA
, qui peut prendre tous les types possibles. - Tous les élèments d'un vecteur doivent être du même type.
- Un vecteur posséde une propriété
length
qui est le nombre d'éléments qu'il contient. On peut l'afficher avec la fonctionlength(monVecteur)
, ou la lire directement dans l'onglet environnement. - Vous pouvez nommer les éléments d'un vecteur avec la syntaxe
names(vecteur) = c("element1", "element2")
. C'est pratique pour identifier facilement le contenu d'un vecteur quand il est affiché dans la console.