Les vecteurs#
Nous avons vu que nous avons créé des variables, nous leur avons donnée des valeurs et nous avons effectué des opérations mathématiques sur ces variables. Nous avons vu que nous avons chargé des packages, nous avons également appelé des fonctions des données venant de packages de base ou incluses dans des packages que nous avons chargés.
On commence à comprendre alors que dans R, tous les éléments sont des objets. Ces derniers sont créés et interagissent entre elles par des instructions (des lignes de code) du programmeur. Par exemple si nous créons une variable de \(x\) de valeur 21, nous venons alors de créer un seul objet \(x\) ayant une valeur 21
x<-21
Nous pouvons en tout moment faire appel à ce vecteur par son attribut;
x
On peut aussi créer une collection de valeurs à l’intérieur d”un seul objet. C’est ce que nous appelons un vecteur
vecteur <-c(1,2,3,4,5)
Notre vecteur est un ensemble d’entiers $\(vecteur=\left\{1,2,3,4,5 \right\}\)$
Regardons la valeur de cet objet que R a gardé en mémoire;
vecteur
- 1
- 2
- 3
- 4
- 5
Regardons maintenant le type de cet objet;
class(vecteur)
Tel qu’attendu, R a automatiquement reconnu le type de ce vecteur sans avoir à le définir. Contrairement à d’autres langages de programmation, tel que C++
, R a donné le type numeric
à cet objet.
autres façons de créer des vecteurs#
vecteur <-1:5
vecteur
- 1
- 2
- 3
- 4
- 5
vecteur <-10:17
vecteur
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
Ceci fonctionne aussi pour les décimales
vecteur <- 17.5:22.5
vecteur
- 17.5
- 18.5
- 19.5
- 20.5
- 21.5
- 22.5
On remarque que les deux façons qu’on vient de voir créent une suite de données avec un saut de 1 entre chaque valeur. On peut utiliser la fonction seq(from = ..., to = ..., by = ...)
afin de changer le saut.
# ?seq
vecteur <-seq(from = 17.5,to = 29.5,by = 2)
vecteur
- 17.5
- 19.5
- 21.5
- 23.5
- 25.5
- 27.5
- 29.5
Extraction des valeurs#
Supposons qu’on voudrait extraire la première valeur se trouvant dans le vecteur;
vecteur # ce vecteur avait comme valeurs
- 17.5
- 19.5
- 21.5
- 23.5
- 25.5
- 27.5
- 29.5
vecteur[1] #le premier objet
Le troisième objet maintenant;
vecteur[3]
vecteur[1:3] # du premier au troisième objet
- 17.5
- 19.5
- 21.5
Si l’on voulait tous sauf le nième élément, on utilise le signe (-)
vecteur [-1] # tout sauf le premier
- 19.5
- 21.5
- 23.5
- 25.5
- 27.5
- 29.5
vecteur[-(1:3)] # tous sauf les trois premiers objets
- 23.5
- 25.5
- 27.5
- 29.5
Combinaison de vecteurs#
Puisque les vecteurs sont des objets ou une collection d’objets, on peut combiner plusieurs vecteurs et effectuer des opérations sur ces derniers.
Créons trois vecteurs;
x<-c(1,2,3)
y <- c(.17, .66, .44)
z<-11
vecteur <-c(x,y,z)
vecteur
- 1
- 2
- 3
- 0.17
- 0.66
- 0.44
- 11
vecteur <-c(x,y,z, -123:-126)
vecteur
- 1
- 2
- 3
- 0.17
- 0.66
- 0.44
- 11
- -123
- -124
- -125
- -126
Taille des vecteurs#
length(vecteur)
Plusieurs types#
Lorsque nous créons un vecteur, R se charge de donner un type à ce dernier. Toutefois, il est possible de mélanger les données de types différents.
Numeric#
Nous avons vu plusieurs exemples de ce type auparavant
Character#
vect_stri <-c("bonjour", "Hi", "你好", "Hola", "صباح الخير","Buongiorno")
vect_stri
- 'bonjour'
- 'Hi'
- '你好'
- 'Hola'
- 'صباح الخير'
- 'Buongiorno'
Regardons maintenant la class
de cette variable;
class(vect_stri)
logical#
vect_bool <- c(T,F,F,F,T,F)
vect_bool
- TRUE
- FALSE
- FALSE
- FALSE
- TRUE
- FALSE
class(vect_bool)
Mélange#
On peut aussi avoir de multiples class dans un seul vecteur;
vect_melange_type<-c(123,"bonjour", T)
vect_melange_type
- '123'
- 'bonjour'
- 'TRUE'
On remarque que R
s’est chargé de tout transformer en type caractère, car « bonjour » ne peut pas prendre le numérique
class(vect_melange_type)
Opértation sur les vecteurs#
Créons notre vecteur
qui nous sert d’exemple”
vecteur <- c(1:5)
vecteur
- 1
- 2
- 3
- 4
- 5
Multiplions ce vecteur par deux, donc toutes les valeurs contenues à l’intérieur de ce dernier;
vecteur*2
- 2
- 4
- 6
- 8
- 10
Ou appliquons une simple adition à lui même;
vecteur+vecteur
- 2
- 4
- 6
- 8
- 10
Si l’on ajoute 5 au vecteur, R
se charge d’ajouter 5 à chaque élément du vecteur
vecteur+5
- 6
- 7
- 8
- 9
- 10
vecteur**2
- 1
- 4
- 9
- 16
- 25
vecteur^2
- 1
- 4
- 9
- 16
- 25
Un autre façon de créer le même vecteur;
vecteur2 <- 2*(1:5)
vecteur2
- 2
- 4
- 6
- 8
- 10
(vecteur*3+vecteur2^2+17)/2
- 12
- 19.5
- 31
- 46.5
- 66
Attention!#
Note Ces opérations fonctionnent sur des vecteurs de même taille. Essayons par exemple d’additionner deux vecteurs de différente taille; le premier contient cinq éléments et le second en contient six.
vecteur5 <-c(1:5)
vecteur6 <-c(1:6)
vecteur5+vecteur6
Warning message in vecteur5 + vecteur6:
“longer object length is not a multiple of shorter object length”
- 2
- 4
- 6
- 8
- 10
- 7
Nous avons quand même un résultat, mais nous avons un avertissement que la taille des deux vecteurs est différente.
On voit que le résultat contient six éléments, R
s’est chargé de réappliquer le même calcul (adition) entre le sixième élément du vecteur6 et le premier élément du vecteur5 puisque le sixième de ce dernier est manquant.
Sequences#
?seq
Cette fonction sert à générer une série de séquence régulière. Les arguments sont;
from
: qui est le début de la séquence qu’on voudrait générer.to
: la fin de la séquenceby
: l’incrément avec lequel on veut augmenter notre séquence
seq(from = 1, to = 5,by=.3)
- 1
- 1.3
- 1.6
- 1.9
- 2.2
- 2.5
- 2.8
- 3.1
- 3.4
- 3.7
- 4
- 4.3
- 4.6
- 4.9
Un autre exemple où l’on crée un incrément de pi
dans une série de 1 à 10;
seq(1, 10, pi)
- 1
- 4.14159265358979
- 7.28318530717959
Si l’on omet de mettre tous les arguments, l’incrément devient alors 1 par défaut.
seq(5)
- 1
- 2
- 3
- 4
- 5
Cela fonctionne aussi si l’on veut générer des nombres négatifs
seq(-1,-5, -.3)
- -1
- -1.3
- -1.6
- -1.9
- -2.2
- -2.5
- -2.8
- -3.1
- -3.4
- -3.7
- -4
- -4.3
- -4.6
- -4.9
Cette fonction nous sert plus souvent lorsqu’on veut générer des vecteurs. D’ailleurs, vérifions si une séquence générée possède les mêmes valeurs qu’un vecteur.
seq(5)
- 1
- 2
- 3
- 4
- 5
1:5
- 1
- 2
- 3
- 4
- 5
seq(5)==1:5
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
Dans la ligne de code ci-haut on s’aperçoit que chaque valeur de la séquence est égale à chaque valeur du vecteur. Si l’on veut savoir par une seule réponse booléenne si toutes les valeurs du vecteur sont égales.
all(seq(5)==1:5)
Ou le contraire, est-ce toutes les valeurs sont différentes?
!all(seq(5)==1:5)
Cela fonctionne aussi si l’on veut générer des nombres négatifs
seq(-1,-5, -1)
- -1
- -2
- -3
- -4
- -5
Cette fonction nous sert plus souvent lorsqu’on veut générer des vecteurs. D’ailleurs, vérifions si une séquence générée possède les mêmes valeurs qu’un vecteur.
vec
seq(5)
Error in eval(expr, envir, enclos): object 'vec' not found
Traceback:
1:5
- 1
- 2
- 3
- 4
- 5
seq(5)==1:5
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
Dans la ligne de code ci-haut on s’aperçoit que chaque valeur de la séquence est égale à chaque valeur du vecteur. Si l’on veut savoir par une seule réponse booléenne si toutes les valeurs du vecteur sont égales.
all(seq(5)==1:5)
Ou le contraire, est-ce toutes les valeurs sont différentes?
!all(seq(5)==1:5)
Replicate#
Replicate Elements of Vectors and Lists
?rep
rep(1, 5)
- 1
- 1
- 1
- 1
- 1
nb_fois=5
rep("qqch", nb_fois)
- 'qqch'
- 'qqch'
- 'qqch'
- 'qqch'
- 'qqch'
On peut aussi répéter un vecteur \(n\) nombre de fois
rep(c(1:5), 3)
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
rep(c('bonjour', 'hello', "Hola"), 4)
- 'bonjour'
- 'hello'
- 'Hola'
- 'bonjour'
- 'hello'
- 'Hola'
- 'bonjour'
- 'hello'
- 'Hola'
- 'bonjour'
- 'hello'
- 'Hola'