Les vecteurs

Objectifs d’apprentissage

Dans cette section, vous apprendrez à créer différents types de vecteurs et à les manipuler.

Les vecteurs numériques

Un vecteur numérique est une collection ordonnée de nombres. Pour établir un vector, nous utilisons la fonction c() qui peut prendre un nombre arbitraire d’arguments :

x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
x
## [1] 10.4  5.6  3.1  6.4 21.7

Lorsque vous recherchez la classe d’un vecteur, vous pouvez utiliser la fonction class() :

class(x)
## [1] "numeric"

Notez que la classe est indiquée “numérique”, cependant, vous avez maintenant affaire à une collection de nombres, et non pas à un nombre unique.

Vous pouvez également utiliser la fonction c() pour concaténer plusieurs vecteurs existants :

x <- c(10.4, 5.6, 3.1 )
y <- c(2,3,4)
z <- c(x,y)
z
## [1] 10.4  5.6  3.1  2.0  3.0  4.0
class(z)
## [1] "numeric"

Générer des séquences régulières de nombres

R possède un certain nombre de fonctions intégrées permettant de générer des séquences de nombres.

L’opérateur deux-points :

L’opérateur : crée une séquence régulière d’entiers. Sa syntaxe est assez intuitive. Pour créer une séquence régulière d’entiers de 1 à 10, il suffit de taper :

x<- 1:10
x
##  [1]  1  2  3  4  5  6  7  8  9 10
class(x)
## [1] "integer"

L’opérateur : a une priorité élevée dans une expression. Vérifiez les résultats des expressions suivantes pour comprendre l’ordre dans lequel les opérateurs travaillent :

2*1:5
## [1]  2  4  6  8 10
n <- 6
1:n-1
## [1] 0 1 2 3 4 5
1 :(n-1)
## [1] 1 2 3 4 5

La fonction seq()

La fonction seq() est plus générale. Consultez le fichier d’aide pour plus de détails. En guise d’introduction, regardez les quelques exemples pour comprendre comment elle fonctionne:

seq(1, 2, by=.2) 
## [1] 1.0 1.2 1.4 1.6 1.8 2.0
seq(length=10, from =-1, by=2)
##  [1] -1  1  3  5  7  9 11 13 15 17

La fonction rep()

La fonction rep() peut être utilisée pour répliquer un objet et créer des vecteurs avec des séquences assez complexes.

Pour mettre, plusieurs copies de bout en bout, utilisez l’argument times :

x <- c(1.34, 2.56)
(s5 <- rep(x, times=5))
##  [1] 1.34 2.56 1.34 2.56 1.34 2.56 1.34 2.56 1.34 2.56

Pour répéter chaque élément trois fois avant de passer au suivant, utilisez l’argument “chacun” :

(s6 <- rep(x, each=3))
## [1] 1.34 1.34 1.34 2.56 2.56 2.56

Calcul vectoriel

Les vecteurs peuvent être utilisés dans des expressions arithmétiques. Attention, les opérations sont effectuées élément par élément. Par exemple, si vous ajoutez deux vecteurs :

\begin{equation} \left(\begin{matrix}a\\b\\c\\d \end{matrix} \right) + \left(\begin{matrix}e\\f\\g\\h \end{matrix} \right) = \left(\begin{matrix}a+e\\b+f\\c+g\\d+h \end{matrix} \right) \end{equation}

Avec R:

x <- c(10.4, 5.6, 3.4)
y <- c(3.1, 6.4, -2.1)
(z <- x + y)
## [1] 13.5 12.0  1.3

Cependant, les vecteurs apparaissant dans un même calcul n’ont pas besoin d’être de la même longueur. S’ils ne le sont pas, la valeur de l’expression est un vecteur de même longueur que le plus long vecteur présent dans l’expression. Les vecteurs plus courts dans l’expression sont recyclés aussi souvent que nécessaire (peut-être de manière fractionnée) jusqu’à ce qu’ils correspondent à la longueur du vecteur le plus long.

En particulier, une constante est simplement répétée.

For example: \begin{equation} \left(\begin{matrix}a\\b\\c \end{matrix} \right) + e = \left(\begin{matrix}a+e\\b+e\\c+e \end{matrix} \right) \end{equation}

x <- c(10.4, 5.6)
y <- 3.1
(z <- x + y)
## [1] 13.5  8.7

Bien que cette fonction R soit très pratique, elle est potentiellement trompeuse et dangereuse à utiliser car elle donne des résultats non initialement prévus lorsque les vecteurs sont de longueur différente, comme dans le cas suivant :

\begin{equation} \left(\begin{matrix}a\\b\\c\\d \end{matrix} \right) +
\left(\begin{matrix}e\\f\\g \end{matrix} \right) = \left(\begin{matrix}a+e\\b+f\\c+g\\d+e \end{matrix} \right) \end{equation}

x <- c(10.4, 5.6, 3.5)
y <- c(1,2)
z <- x + y
## Warning in x + y: longer object length is not a multiple of shorter object
## length
z
## [1] 11.4  7.6  4.5

Juste pour vous rappeler du danger potentiel, R lancera un message d’avertissement, mais effectuera l’opération.

Les opérateurs arithmétiques élémentaires sont les +, -, *, /, et ^ pour l’élévation à une puissance. En outre, toutes les fonctions arithmétiques courantes sont disponibles: log, exp, sin, cos, tan, sqrt, …

x <- c(10.4, 5.6, 3.5)
log(x)
## [1] 2.341806 1.722767 1.252763

Les fonctions fonctionnent donc sur des vecteurs comme elle fonctionne sur une valeur unique, et renvoient un vecteur de valeurs transformées.

Fonctions utiles appliquées à des vecteurs

Plusieurs fonctions sont très utiles pour les statistiques de base.

max and min fonctionnent un peu différemment et retourne un nombre unique.

min(x)
## [1] 3.5

La fonction sum(), additionne tous les éléments du vecteur. La fonction mean() calcule la valeur moyenne de tous les éléments du vecteur. Nous pouvons combiner l’arithmétique vectorielle avec ces fonctions pour calculer très rapidement des statistiques intéressantes du vecteur.

x <- c(10.4, 5.6, 3.5, 3.1, 7.2, 3.8, 10.2, 7.8)
mean(x)
## [1] 6.45
x - mean(x)  #calcule les déviations par rapport à la moyenne
## [1]  3.95 -0.85 -2.95 -3.35  0.75 -2.65  3.75  1.35

Nous pouvons également calculer la variance:

$$ var(x) = \frac{1}{n-1} \sum_{i=1}^n (x_i - \bar{x})^2 $$

x <- c(10.4, 5.6, 3.5, 3.1, 7.2, 3.8, 10.2, 7.8)
mean(x)
## [1] 6.45
v<- sum((x - mean(x))^2) / (length(x)-1)  #calculate the variance
v
## [1] 8.531429
# note that a variance function already exists!
var(x)
## [1] 8.531429

Notez que possède déjà une fonction intégrée pour calculer la variance de l’échantillon var().

Vecteurs avec d’autres types de données

Les vecteurs peuvent contenir d’autres types de données, en particulier des caractères et des logiques.

c("ceci", "est", "a", "chaîne", "vecteur")
## [1] "ceci"    "est"     "a"       "chaîne"  "vecteur"
c(TRUE, FALSE, FALSE, TRUE)
## [1]  TRUE FALSE FALSE  TRUE

Cependant, une caractéristique importante des vecteurs est qu’ils stockent les mêmes types de données.

Forçage automatique des types à l’intérieur des vecteurs

Si nous essayons de combiner des chiffres et des caractères dans un même vecteur, vous pouvez vous attendre à une erreur. Cependant, R tente d’être flexible avec les types de données et va uniformiser les types de données au sein du vecteur.

Observez ce qui se passe si vous combinez des chiffres et des caractères dans le même vecteur :

c(1, "Afrique du Sud", 3, "France", 4, "Sénégal")
## [1] "1"              "Afrique du Sud" "3"              "France"        
## [5] "4"              "Sénégal"

Vous n’avez même pas droit à un message d’alerte !

R a converti les nombres 1, 3 et 4 en chaînes de caractères. La classe du vecteur est donc caractère. Même si 1 et 3 étaient à l’origine des nombres quand nous l’avons écrit, R les a convertis en caractères.

*R a forcé toutes les données à devenir une chaîne de caractères * Il a décidé que, parce que nous avons mis une chaîne de caractères, il faudrait que le 1 et le 3 soient aussi des chaînes de caractères.

Encore une fois, sachez que R va forcer les variables sans aucun message d’alerte ! Cela peut donc conduire à des résultats inattendus et des erreurs en aval de vos programmes si vous esperiez que les nombres soient considérés … comme des numériques

Notez enfin que R émettra une erreur lorsqu’il tentera de contraindre une variable à entrer dans un nouveau type, mais qu’il ne pourra pas le faire.

Indexer les vecteurs pour obtenir des sous-ensembles d’un vecteur

Les sous-ensembles des éléments d’un vecteur peuvent être sélectionnés en ajoutant un vecteur d’indice entre crochets. Plus généralement, toute expression qui évalue un vecteur peut avoir des sous-ensembles de ses éléments sélectionnés de manière similaire en ajoutant un vecteur index entre crochets immédiatement après l’expression.

Ces vecteurs index peuvent prendre l’une des quatre formes suivantes

Index = Un vecteur logique.

Dans ce cas, le vecteur index a la même longueur que le vecteur à partir duquel les éléments doivent être sélectionnés. Les valeurs correspondant à TRUE dans le vecteur index sont sélectionnées et celles correspondant à FALSE sont omises. Par exemple, les lignes suivantes créent un objet “y” qui contiendra les valeurs de x supérieures à 4, dans le même ordre.

(x <- rnorm(10, mean=3, sd=2))
##  [1]  2.38047601  3.06488183  0.70988003  2.13786607  0.08193631 -1.35477889
##  [7]  4.32500639  3.20267343  5.84360852  6.68385296
y <- x[x > 4]
y
## [1] 4.325006 5.843609 6.683853

Index = Un vecteur d’entiers.

Dans ce cas, les valeurs du vecteur index doivent se trouver dans l’ensemble {1, 2, …, length(x)}. Les éléments correspondants du vecteur sont sélectionnés et concaténés, dans cet ordre, dans le résultat. Le vecteur index peut être de n’importe quelle longueur et le résultat est de la même longueur que le vecteur index.

(x <- rnorm(10))
##  [1]  0.82890663 -0.93467878  0.74377070  0.73953505 -0.07424081  0.18875656
##  [7] -0.68019563 -0.30212328  0.47470959 -0.98354614
(y <- x [1:5])
## [1]  0.82890663 -0.93467878  0.74377070  0.73953505 -0.07424081
(z <- x[c(1,3,2,7)])
## [1]  0.8289066  0.7437707 -0.9346788 -0.6801956

L’utilisation de vecteurs index peut être très puissante pour créer des séquences complexes :

c("x","y")[rep(c(1,2,2,1), times=2)]
## [1] "x" "y" "y" "x" "x" "y" "y" "x"

Index = Un vecteur d’entiers négatifs

Un tel vecteur d’indice spécifie les valeurs à exclure plutôt qu’à inclure. Ainsi :

x[-(1:5)] # donne y tous les éléments de x sauf les cinq premiers.
## [1]  0.1887566 -0.6801956 -0.3021233  0.4747096 -0.9835461

Index = Un vecteur de chaînes de caractères.

Cette possibilité ne s’applique que lorsqu’un objet possède un attribut “names” pour identifier ses composants. Dans ce cas, un sous-vecteur du vecteur de noms peut être utilisé de la même manière que les étiquettes intégrales positives du point 2 ci-dessus.

fruits <- c(5, 10, 1, 20)
names(fruits) <- c("orange", "banane", "pomme", "pêche") # nous ajoutons un attribut name
dejeuner <- fruits [c("pomme", "orange")] # puis nous pouvons sélectionner les éléments par leur nom
dejeuner
##  pomme orange 
##      1      5

Notez dans ce cas, que nous avons ajouté une attribut au vecteur, car chaque élément du vecteur est associé à un nom. Ceci est obtenu en utilisant la fonction names().

L’avantage est que les noms alphanumériques sont souvent plus faciles à retenir que les indices numériques.

Exercices

Ex 1: Exercise 1

Créer des vecteurs correspondant aux noms suivants:

  • mois
  • nombresPremiers1a7
Afficher la réponse

mois <- c("Janv", "Fevr", "Mars", "Avri", "Mai", "Juin", "Juil", "Aout", "Sept", "Oct", "Nove", "Dece")
mois
##  [1] "Janv" "Fevr" "Mars" "Avri" "Mai"  "Juin" "Juil" "Aout" "Sept" "Oct" 
## [11] "Nove" "Dece"
nombresPremiers1a7 <- c(1,2,3,5,7)
nombresPremiers1a7
## [1] 1 2 3 5 7

Ex 2: Exercise 2

  • Créer un vecteur des nombres de jours pour chaque mois de l’année.
  • Ajouter un attribut “names” à chaque nombre pour qu’il soit plus facile de les identifier.
  • Créer un vecteur printemps qui ne indique le nombre de jours par mois mais que pour les mois d’Avril, Mai et Juin
Afficher la réponse

nombreJour <- c(31, 28, 31,30,31,30,31,31, 30, 31, 30, 31 )
names(nombreJour) <- c("Janv", "Fevr", "Mars", "Avri", "Mai", "Juin", "Juil", "Aout", "Sept", "Oct", "Nove", "Dece")
nombreJour
## Janv Fevr Mars Avri  Mai Juin Juil Aout Sept  Oct Nove Dece 
##   31   28   31   30   31   30   31   31   30   31   30   31
printemps <- nombreJour[c("Avri", "Mai", "Juin")]
printemps
## Avri  Mai Juin 
##   30   31   30

Exercise 3

Créer un vecteur seq96 qui contient 96 valeurs et qui reproduit la séquence 1, 2, 3, 1, 2, 3, …., 1, 2, 3

Afficher la réponse

seq96 <- rep(1:3,times = 96/3)
seq96
##  [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2
## [39] 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1
## [77] 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3

Exercise 4

  • Créer un vecteur “seq10” qui contient 10 valeurs et qui reproduit la séquence 1,1,2,2,3,3,4,4,5,5 (ne tapez pas directement les valeurs)
  • Créer un vecteur sous-ensemble de seq10 qui ne contiendra que les valeurs allant de 1 a 3 et sauver le résultat dans une variable appelée “seq6”
Afficher la solution

seq10 <- rep(1:5, each=2)
seq10
##  [1] 1 1 2 2 3 3 4 4 5 5
seq6 <- seq10[seq10<4]
seq6
## [1] 1 1 2 2 3 3

Précédent
Suivant