Les vecteurs dans R

aaaaaaaaaaaaaaaa

 Lors de l'application d'une opération à deux vecteurs qui nécessitent qu'ils aient la même longueur, R recycle automatiquement, ou le répète, le plus court, jusqu'à ce qu'il soit suffisamment long pour correspondre le plus long. Voici un exemple:

  1. > c (1,2,4) + c (6,0,9,20,22)
  2. [1] 7 2 13 21 24
Source code

Message d'avertissement: longueur d'objet plus longue
n'est pas un multiple de longueur d'objet plus courte dans: c (1, 2, 4) + c (6, 0, 9, 20, 22)
Le vecteur plus court a été recyclé, de sorte que l'opération a été prise comme suit:

  1. > c (1,2,4,1,2) + c (6,0,9,20,22)
Source code
Voici un exemple plus subtil:

  1. > x
  2. [,1] [,2]
  3. [1,] 1 4
  4. [2,] 2 5
  5. [3,] 3 6
  6. > x+c(1,2)
  7. [,1] [,2]
  8. [1,] 2 6
  9. [2,] 4 6
  10. [3,] 4 8
Source code

Encore une fois, gardez à l'esprit que les matrices sont en fait des vecteurs longs. Ici, x, en tant que matrice 3 par 2, est également un vecteur à six éléments, qui dans R est stocké en colonne par colonne. En d'autres termes, en termes de stockage, x est le même que c (1,2,3,4,5,6). Nous avons ajouté un vecteur à deux éléments à cet élément à six éléments, de sorte que notre vecteur ajouté devait être répété deux fois pour créer six éléments. En d'autres termes, nous procédions essentiellement à cela:

  1. x + c (1,2,1,2,1,2)
Source code

Non seulement cela, mais c (1,2,1,2,1,2) a également été changé d'un vecteur à une matrice ayant la même forme que x avant l'addition a eu lieu:
1 2
2 1
1 2
Ainsi, le résultat net était de calculer ce qui suit:

 

 

 

Dans cette section, nous discuterons de quelques faits divers liés à la fonction de concaténation, c (), qui sont souvent utiles.
Si les arguments que vous passez à c () sont de différents modes, ils seront réduits à un type qui est le dénominateur commun le plus bas, comme suit:
  1. > c(5,2,"abc")
  2. [1] "5" "2" "abc"
  3. > c(5,2,list(a=1,b=4))
  4. [[1]]
  5. [1] 5
  6. [[2]]
  7. [1] 2
  8. $a
  9. [1] 1
  10. $b
  11. [1] 4
Source code
Dans le premier exemple, nous combinons les modes entier et caractère, une combinaison que R choisit de réduire au dernier mode. Dans le deuxième exemple, R considère que le mode de liste doit avoir une priorité inférieure dans les expressions mixtes. Nous en discuterons plus loin à la section 4.3.
Vous ne voudrez probablement pas écrire de code qui fait de telles combinaisons, mais vous pouvez rencontrer un code dans lequel cela se produit, il est donc important de respecter l'effet.
Un autre point à garder à l'esprit est que c () a un effet d'aplatissement pour les vecteurs, comme dans cet exemple:
  1. > c (5,2, c (1,5,6))
  2. [1] 5,0 2,0 1,5 6,0
Source code
Ceux qui connaissent d'autres langues, comme Python, ont peut-être attendu le code précédent pour produire un objet à deux niveaux. Cela ne se produit pas avec les vecteurs R, même si vous pouvez avoir des listes à deux niveaux, comme vous le verrez au chapitre 4.
Dans le chapitre suivant, nous passons à un cas spécial très important de vecteurs, celui des matrices et des matrices.

Les éléments d'un vecteur peuvent éventuellement être nommés. Par exemple, disons que nous avons un vecteur à 50 éléments montrant la population de chaque état aux États-Unis. Nous pourrions nommer chaque élément en fonction de son nom d'état, comme «Montana» et «New Jersey». Cela pourrait entraîner des points de dénomination dans les parcelles, et ainsi de suite.
Nous pouvons assigner ou interroger des noms d'éléments vectoriels via la fonction names ():

  1. > x <- c(1,2,4)
  2. > names(x)
  3. NULL
  4. > names(x) <- c("a","b","ab")
  5. > names(x)
  6. [1] "a" "b" "ab"
  7. > x
  8. a b ab
  9. 1 2 4
Source code

Nous pouvons supprimer les noms d'un vecteur en assignant NULL:
  1. > names(x) <- NULL
  2. > x
  3. [1] 1 2 4
Source code

Nous pouvons même référencer les éléments du vecteur par nom:
  1. > x <- c(1,2,4)
  2. > names(x) <- c("a","b","ab")
  3. > x["b"]
  4. b
  5. 2
Source code

 

Supposons que nous souhaitons tester si deux vecteurs sont égaux. L'approche naïve, utilisant ==, ne fonctionnera pas.

  1. > x <- 1: 3
  2. > y <- c (1,3,4)
  3. > x == y
  4. [1] TRUE FALSE FALSE
Source code
Qu'est-il arrivé? Le point essentiel est que nous traitons de la vectorisation. Tout comme presque n'importe quoi dans R, == est une fonction.
  1. > "==" (3,2) [1] FALSE
  2. > i <- 2
  3. > "==" (i, 2) [1] TRUE
Source code
En fait, == est une fonction vectorisée. L'expression x == y applique la fonction == () aux éléments de x et y. donnant un vecteur de valeurs booléennes.
Que peut-on faire à la place? Une option est de travailler avec la nature vectorisée de ==, en appliquant la fonction all ():
  1. > x <- 1:3
  2. > y <- c(1,3,4)
  3. > x == y
  4. [1] TRUE FALSE FALSE
  5. > all(x == y)
  6. [1] FALSE
Source code
L'application de all() au résultat de == demande si tous les éléments de ce dernier sont vrais, ce qui est identique à savoir si x et y sont identiques.
Ou encore mieux, nous pouvons simplement utiliser la fonction identique, comme ceci:
  1. > identical(x,y)
  2. [1] FALSE
Source code
Soyez prudent, bien que le mot identique signifie vraiment ce qu'il dit. Considérons cette petite session R:
  1. > x <- 1:2
  2. > y <- c(1,2)
  3. > x
  4. [1] 1 2
  5. > y
  6. [1] 1 2
  7. > identical(x,y)
  8. [1] FALSE
  9. > typeof(x)
  10. [1] "integer"
  11. > typeof(y)
  12. [1] "double"
Source code
Ainsi,: produit des nombres entiers tandis que c () produit des nombres à virgule flottante. Qui savait?