Une autre caractéristique reflétant la nature du langage fonctionnel de R est le filtrage. Cela nous permet d'extraire les éléments d'un vecteur qui satisfont certaines conditions. Le filtrage est l'une des opérations les plus courantes dans R, car les analyses statistiques se concentrent souvent sur des données qui répondent aux conditions d'intérêt.
1 Générer des indices de filtrage
Commençons par un exemple simple:
En regardant ce code de manière intuitive, "Quelle est notre intention?", Nous voyons que nous avons demandé à R d'extraire de z tous ses éléments dont les carrés étaient supérieurs à 8 et ensuite attribuer ce sous-vecteur à w.
Mais le filtrage est une opération clé dans R qu'il vaut la peine d'examiner les détails techniques.
L'évaluation de l'expression z * z> 8 nous donne un vecteur de valeurs booléennes! Il est très important que vous compreniez exactement comment cela se produit.
Tout d'abord, dans l'expression z * z> 8, notez que tout est un vecteur ou un opérateur vectoriel:
• Puisque z est un vecteur, cela signifie que z * z sera également un vecteur (de même longueur que z).
• En raison du recyclage, le numéro 8 (ou vecteur de la longueur 1) devient le vecteur (8,8,8,8) ici.
• L'opérateur >, comme +, est en fait une fonction.
Regardons un exemple de ce dernier point:
Ainsi, ce qui suit:
et
En d'autres termes, nous appliquons une fonction aux vecteurs - encore un autre cas de vectorisation, pas différent des autres que vous avez vu. Et donc le résultat est un vecteur - dans ce cas, un vecteur de booléens. Ensuite, les valeurs booléennes résultantes sont utilisées pour éliminer les éléments désirés de z:
Cet exemple suivant mettra les choses en évidence même plus nettement. Ici, nous allons définir à nouveau notre condition d'extraction en termes de z, mais nous utiliserons les résultats pour extraire d'un autre vecteur, y, au lieu d'extraire de z:
Ou, de façon plus compacte, nous pourrions écrire ce qui suit:
Encore une fois, le point est que dans cet exemple, nous utilisons un vecteur, z, pour déterminer les indices à utiliser dans le filtrage d'un autre vecteur, y. En revanche, notre exemple précédent a utilisé z pour se filtrer.
Voici un autre exemple, celui-ci impliquant une affectation. Disons que nous avons un vecteur x dans lequel nous voulons remplacer tous les éléments supérieurs à un 3 avec un 0. Nous pouvons le faire de façon très compacte, en fait, en une seule ligne:
Allons vérifier:
2 Filtrage avec la fonction subset()
Le filtrage peut également être effectué avec la fonction subset(). Lorsqu'il est appliqué à des vecteurs, la différence entre l'utilisation de cette fonction et le filtrage ordinaire réside dans la manière dont les valeurs de NA sont traitées.
Lorsque nous avons fait un filtrage ordinaire dans la section précédente, R a déclaré: "Bien, x [5] est inconnu, il est également inconnu si son carré est supérieur à 5." Mais vous ne pouvez pas vouloir NA dans vos résultats. Lorsque vous désirez exclure les valeurs de NA, l'utilisation de la fonction subset() vous permet d'éviter de supprimer les valeurs de NA vous-même.
3 La fonction de sélection which()
Comme vous l'avez vu, le filtrage consiste à extraire des éléments d'un vecteur z qui satisfont une certaine condition. Dans certains cas, cependant, nous voulons simplement trouver les positions dans z à laquelle la condition se produit. Nous pouvons le faire comme la fonction which(), comme suit:
Le résultat indique que les éléments 1, 3 et 4 de z ont des carrés supérieurs à 8.
Comme pour le filtrage, il est important de comprendre exactement ce qui s'est passé dans le code précédent. L'expression
est évalué à (TRUE, FALSE, TRUE, TRUE). La fonction which() indique simplement quels éléments de cette dernière expression sont VRAIS.
Un usage pratique de which() est destiné à déterminer l'emplacement dans un vecteur dont la première apparition de certaines conditions se confirme. Par exemple, rappelez notre code à la page 27 pour trouver la première 1 valeur dans un vecteur x:
Voici une autre façon de coder cette tâche:
L'appel de la fonction which() produit les indices de 1s dans x. Ces indices seront donnés sous la forme d'un vecteur, et nous demandons l'indice d'élément 1 dans ce vecteur, qui est l'indice du premier 1.
C'est beaucoup plus compact. D'autre part, il est un gaspillage, car il trouve réellement toutes les instances de 1s en x, quand nous n'avons besoin que de la première. Donc, bien qu'il s'agisse d'une approche vectorielle et donc probablement plus rapide, si le premier 1 arrive au début de x, cette approche peut être plus lente.