Indexation

Comme je vous l’ai expliqué la dernière fois, les vecteurs sont des objets ordonnés ; c’est-à-dire que chaque élément d’un vecteur a une position définie à l’intérieur du vecteur.

Par exemple, le premier élément de alpha est "l" qui est donc en position 1 et le dernier élément de alpha est "z" qui est donc en position length(alpha) = 15.

> alpha
 [1] "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

Imaginez que vous souhaitiez extraire le cinquième élément de alpha :

> alpha[5]
[1] "p"

Assignons ça à un nouvel objet test :

> test <- alpha[5] 
> class(test)
[1] "character"
> length(test)
[1] 1
Ça fonctionne aussi sur les autres types de vecteurs, avec dates par exemple :
> dates
 [1] "2000-01-01" "2000-01-02" "2000-01-03" "2000-01-04" "2000-01-05"
 [6] "2000-01-06" "2000-01-07" "2000-01-08" "2000-01-09" "2000-01-10"
[11] "2000-01-11" "2000-01-12" "2000-01-13" "2000-01-14" "2000-01-15"

Si nous voulons le cinquième élément :

> dates[5]
[1] "2000-01-05"

Une autre chose que vous pourriez vouloir faire, c’est récupérer les trois premiers éléments de alpha. C’est très facile ; puisque nous savons que :

> 1:3
[1] 1 2 3

Alors, nous pouvons écrire :

test <- alpha[1:3]

Et nous obtenons bien :

> test
[1] "l" "m" "n"

Ceux qui ont bien suivi m’objecteront que nous aurions pu utiliser la fonction head pour faire la même chose. C’est vrai, mais imaginez que nous souhaitions récupérer les éléments en première, troisième et cinquième position de alpha. Puisque :

> c(1, 3, 5)
[1] 1 3 5

Alors :

> test <- alpha[c(1, 3, 5)]
> test
[1] "l" "n" "p"

Ou encore, puisque :

> seq(1, by = 2, len = 3)
[1] 1 3 5

Nous pouvons écrire :

> test <- alpha[seq(1, by = 2, len = 3)]
> test
[1] "l" "n" "p"

Si vous souhaitez récupérer les 3 derniers éléments de alpha (sans utiliser la fonction tail), vous pouvez exécuter :

> alpha[c(13, 14, 15)]
[1] "x" "y" "z"

Ou :

> alpha[(length(alpha)-2):length(alpha)]
[1] "x" "y" "z"

(Notez l’usage des parenthèses.)

Ou encore :

> alpha[length(alpha)-2:0]
[1] "x" "y" "z"

Notez que l’opération 15-2:0 donne la séquence {13, 14, 15} c’est-à-dire {15-2, 15-1, 15-0} ; en d’autres termes, R a recyclé 15. On y reviendra plus tard.

Ce système d'indexation vous permet aussi de faire des choses comme ça :

> alpha[rep(length(alpha), 10)]
 [1] "z" "z" "z" "z" "z" "z" "z" "z" "z" "z"

Et si vous souhaitez non pas sélectionner mais retirer un élément de alpha, vous pouvez utiliser des indices négatifs :

> alpha[-2]
[1] "l" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
> alpha[c(-2, -4)]
[1] "l" "n" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

La fonction d'aide est accessible en exécutant :

> ?"["

Vous pouvez donner des noms aux éléments d’un vecteur. Par exemple, puisque alpha a la même longueur que value :

> value
 [1]  735  320  325  392  524  450 1459  135  465  600  330  336  280  315
[15]  870

On peut écrire :

names(value) <- alpha

Ce qui a pour effet :

> value
   l    m    n    o    p    q    r    s    t    u    v    w    x    y    z 
 735  320  325  392  524  450 1459  135  465  600  330  336  280  315  870

Je vous raconte ça parce que vous pouvez aussi indexer un vecteur par les noms de ses éléments. Par exemple, puisque :

> c("o", "r")
[1] "o" "r"

On peut écrire :

> value[c("o", "r")]
   o    r 
 392 1459

Notez que :

> value[["o"]]
[1] 392

Permet de sélectionner un (seul) élément en se débarrassant des noms.

Encore plus fort, vous pouvez utiliser des vecteurs logical pour indexer d’autres objets. Si vous vous souvenez bien, logic prend deux valeurs : TRUE là où les valeurs de value sont supérieures à la médiane de value et FALSE dans les autres cas :

> logic
 [1]  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE
[13] FALSE FALSE  TRUE

Eh bien si vous écrivez :

test <- value[logic]

Vous obtenez la sélection des valeurs de valuelogic est TRUE :

> test
   l    p    q    r    t    u    z 
 735  524  450 1459  465  600  870

Vous auriez pu directement écrire :

test <- value[value > median(value)]

Et ce n’est pas fini : de la même manière que vous pouvez sélectionner des éléments d’un vecteur (par les positions, par les noms ou avec un vecteur logique), vous pouvez aussi remplacer des éléments d’un vecteur.

Par exemple, si vous souhaitez remplacer le premier élément de value par le maximum de value, vous pouvez écrire :

value[1] <- max(value)

Et en effet :

> max(value)
[1] 1459
> value
   l    m    n    o    p    q    r    s    t    u    v    w    x    y    z 
1459  320  325  392  524  450 1459  135  465  600  330  336  280  315  870

De la même façon, vous pouvez créer un indice logique pour remplacer tous les éléments de value qui sont inférieur à 350 par 100 :

> value[value < 350] <- 100
> value
   l    m    n    o    p    q    r    s    t    u    v    w    x    y    z 
1459  100  100  392  524  450 1459  100  465  600  100  100  100  100  870

Devinez ce que cette ligne fait :

alpha[value == 100] <- toupper(alpha[value == 100])

(Notez le double = qui évite la confusion avec une assignation.)

Enfin, et je m’en tiendrais là, vous pouvez aussi faire ceci :

> value[] <- 0
> value
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

… qui remplit tout le vecteur value de zéros.

À ne pas confondre avec :

> value <- 0
> value
[1] 0

… qui remplace le vecteur value par zéro.

Et maintenant, inspectons plus en détail nos cinq types de vecteurs.

Aucun commentaire:

Enregistrer un commentaire