Dans le monde des statistiques, la réduction des dimensions est une bonne chose, avec de nombreuses procédures statistiques visant à bien le faire. Si nous travaillons avec, par exemple, 10 variétés et que nous pouvons réduire ce nombre à 3 qui capte toujours l'essence de nos données, nous sommes heureux.
Cependant, dans R, quelque chose d'autre pourrait mériter la réduction de la dimension du nom que nous pouvons parfois souhaiter éviter. Disons que nous avons une matrice à quatre rangées et que nous extrayons une ligne:

  1. > z
  2. [,1] [,2]
  3. [1,] 1 5
  4. [2,] 2 6
  5. [3,] 3 7
  6. [4,] 4 8
  7. > r <- z[2,]
  8. > r
  9. [1] 2 6
Source code

Cela semble inoffensif, mais notez le format dans lequel R a affiché r. C'est un format vectoriel, pas un format matriciel. En d'autres termes, r est un vecteur de longueur 2, et non une matrice 1-par-2. Nous pouvons le confirmer de plusieurs façons:

  1. $dim
  2. [1] 4 2
  3. NULL
  4. > str(z)
  5. int [1:4, 1:2] 1 2 3 4 5 6 7 8
  6. > str(r)
  7. int [1:2] 2 6
Source code

Ici, R nous informe que z a des numéros de lignes et de colonnes, alors que r ne le fait pas. De même, str () nous dit que z a des indices allant en 1: 4 et 1: 2, pour les lignes et les colonnes, alors que les indices de r sont tout simplement en 1: 2. Aucun doute à ce sujet-r est un vecteur, pas une matrice.
Cela semble naturel, mais dans de nombreux cas, cela entraînera des problèmes dans les programmes qui font beaucoup d'opérations matricielles. Vous pouvez constater que votre code fonctionne bien en général mais échoue dans un cas particulier. Par exemple, supposons que votre code extrait une sous-matrice d'une matrice donnée puis effectue des opérations matricielles sur la sous-matrice. Si la sous-matrice n'a qu'une seule ligne, R en fera un vecteur, ce qui pourrait ruiner votre calcul.
Heureusement, R a un moyen de supprimer cette réduction de dimension: l'argument de baisse. Voici un exemple, en utilisant la matrice z d'en haut:

  1. > r <- z[2,, drop=FALSE]
  2. > r
  3. [,1] [,2]
  4. [1,] 2 6
  5. > dim(r)
  6. [1] 1 2
Source code
Maintenant, r est une matrice 1-par-2, pas un vecteur à deux éléments.
Pour ces raisons, vous pourriez trouver utile d'inclure systématiquement l'argument drop = FALSE dans tout votre code de matrice.
Pourquoi pouvons-nous parler de laisser tomber comme un argument? Parce que [est en fait une fonction, comme c'est le cas pour les opérateurs comme +. Considérez le code suivant:

  1. > z[3,2]
  2. [1] 7
  3. > "["(z,3,2)
  4. [1] 7
Source code
Si vous avez un vecteur que vous souhaitez être traité comme une matrice, vous pouvez utiliser la fonction as.matrix (), comme suit:

  1. > u
  2. [1] 1 2 3
  3. > v <- as.matrix(u)
  4. NULL
  5. $dim
  6. [1] 3 1
Source code