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
21

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. 1
  2. 2
  3. 3
  4. 4
  5. 5

Regardons maintenant le type de cet objet;

class(vecteur)
'numeric'

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. 1
  2. 2
  3. 3
  4. 4
  5. 5
vecteur <-10:17
vecteur
  1. 10
  2. 11
  3. 12
  4. 13
  5. 14
  6. 15
  7. 16
  8. 17

Ceci fonctionne aussi pour les décimales

vecteur <- 17.5:22.5
vecteur
  1. 17.5
  2. 18.5
  3. 19.5
  4. 20.5
  5. 21.5
  6. 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
  1. 17.5
  2. 19.5
  3. 21.5
  4. 23.5
  5. 25.5
  6. 27.5
  7. 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
  1. 17.5
  2. 19.5
  3. 21.5
  4. 23.5
  5. 25.5
  6. 27.5
  7. 29.5
vecteur[1] #le premier objet
17.5

Le troisième objet maintenant;

vecteur[3]
21.5
vecteur[1:3] # du premier au troisième objet
  1. 17.5
  2. 19.5
  3. 21.5

Si l’on voulait tous sauf le nième élément, on utilise le signe (-)

vecteur [-1] # tout sauf le premier
  1. 19.5
  2. 21.5
  3. 23.5
  4. 25.5
  5. 27.5
  6. 29.5
vecteur[-(1:3)] # tous sauf les trois premiers objets
  1. 23.5
  2. 25.5
  3. 27.5
  4. 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. 1
  2. 2
  3. 3
  4. 0.17
  5. 0.66
  6. 0.44
  7. 11
vecteur <-c(x,y,z, -123:-126)
vecteur
  1. 1
  2. 2
  3. 3
  4. 0.17
  5. 0.66
  6. 0.44
  7. 11
  8. -123
  9. -124
  10. -125
  11. -126

Taille des vecteurs#

length(vecteur)
11

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
  1. 'bonjour'
  2. 'Hi'
  3. '你好'
  4. 'Hola'
  5. 'صباح الخير'
  6. 'Buongiorno'

Regardons maintenant la class de cette variable;

class(vect_stri)
'character'

logical#

vect_bool <- c(T,F,F,F,T,F)
vect_bool
  1. TRUE
  2. FALSE
  3. FALSE
  4. FALSE
  5. TRUE
  6. FALSE
class(vect_bool)
'logical'

Mélange#

On peut aussi avoir de multiples class dans un seul vecteur;

vect_melange_type<-c(123,"bonjour", T)
vect_melange_type
  1. '123'
  2. 'bonjour'
  3. '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)
'character'

Opértation sur les vecteurs#

Créons notre vecteur qui nous sert d’exemple”

vecteur <- c(1:5)
vecteur
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5

Multiplions ce vecteur par deux, donc toutes les valeurs contenues à l’intérieur de ce dernier;

vecteur*2
  1. 2
  2. 4
  3. 6
  4. 8
  5. 10

Ou appliquons une simple adition à lui même;

vecteur+vecteur
  1. 2
  2. 4
  3. 6
  4. 8
  5. 10

Si l’on ajoute 5 au vecteur, R se charge d’ajouter 5 à chaque élément du vecteur

vecteur+5
  1. 6
  2. 7
  3. 8
  4. 9
  5. 10
vecteur**2
  1. 1
  2. 4
  3. 9
  4. 16
  5. 25
vecteur^2
  1. 1
  2. 4
  3. 9
  4. 16
  5. 25

Un autre façon de créer le même vecteur;

vecteur2 <- 2*(1:5)
vecteur2
  1. 2
  2. 4
  3. 6
  4. 8
  5. 10
(vecteur*3+vecteur2^2+17)/2
  1. 12
  2. 19.5
  3. 31
  4. 46.5
  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”
  1. 2
  2. 4
  3. 6
  4. 8
  5. 10
  6. 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équence

  • by: l’incrément avec lequel on veut augmenter notre séquence

 seq(from = 1, to = 5,by=.3)
  1. 1
  2. 1.3
  3. 1.6
  4. 1.9
  5. 2.2
  6. 2.5
  7. 2.8
  8. 3.1
  9. 3.4
  10. 3.7
  11. 4
  12. 4.3
  13. 4.6
  14. 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. 1
  2. 4.14159265358979
  3. 7.28318530717959

Si l’on omet de mettre tous les arguments, l’incrément devient alors 1 par défaut.

seq(5)
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5

Cela fonctionne aussi si l’on veut générer des nombres négatifs

seq(-1,-5, -.3)
  1. -1
  2. -1.3
  3. -1.6
  4. -1.9
  5. -2.2
  6. -2.5
  7. -2.8
  8. -3.1
  9. -3.4
  10. -3.7
  11. -4
  12. -4.3
  13. -4.6
  14. -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. 1
  2. 2
  3. 3
  4. 4
  5. 5
1:5
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
seq(5)==1:5
  1. TRUE
  2. TRUE
  3. TRUE
  4. TRUE
  5. 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)
TRUE

Ou le contraire, est-ce toutes les valeurs sont différentes?

!all(seq(5)==1:5)
FALSE

Cela fonctionne aussi si l’on veut générer des nombres négatifs

seq(-1,-5, -1)
  1. -1
  2. -2
  3. -3
  4. -4
  5. -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. 1
  2. 2
  3. 3
  4. 4
  5. 5
seq(5)==1:5
  1. TRUE
  2. TRUE
  3. TRUE
  4. TRUE
  5. 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)
TRUE

Ou le contraire, est-ce toutes les valeurs sont différentes?

!all(seq(5)==1:5)
FALSE

Replicate#

Replicate Elements of Vectors and Lists

?rep
rep(1, 5) 
  1. 1
  2. 1
  3. 1
  4. 1
  5. 1
nb_fois=5
rep("qqch", nb_fois)
  1. 'qqch'
  2. 'qqch'
  3. 'qqch'
  4. 'qqch'
  5. 'qqch'

On peut aussi répéter un vecteur \(n\) nombre de fois

rep(c(1:5), 3)
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5
rep(c('bonjour', 'hello', "Hola"), 4)
  1. 'bonjour'
  2. 'hello'
  3. 'Hola'
  4. 'bonjour'
  5. 'hello'
  6. 'Hola'
  7. 'bonjour'
  8. 'hello'
  9. 'Hola'
  10. 'bonjour'
  11. 'hello'
  12. 'Hola'