Avec des facteurs, nous avons encore un autre membre de la famille des fonctions d'application, tapply. Nous examinerons cette fonction, ainsi que deux autres fonctions couramment utilisées avec les facteurs: split () et par ().
1 La fonction tapply ()
En tant que motivation, supposons que nous avons un vecteur x des âges des électeurs et un facteur f montrant un trait non-uniforme de ces électeurs, comme l'affiliation du parti (démocrate, républicain, non affilié). Nous souhaitons trouver les âges moyens dans x dans chacun des groupes du parti.
Dans l'utilisation typique, l'appel tapply (x, f, g) a x comme vecteur, f comme facteur ou liste de facteurs, et g comme fonction. La fonction g () dans notre petit exemple ci-dessus serait la fonction mean() de R intégrée. Si nous voulions regrouper par les deux partis et un autre facteur, disons genre, nous aurions besoin de f pour constituer les deux facteurs, le parti et le genre.
Chaque facteur dans f doit avoir la même longueur que x. Cela a du sens à la lumière de l'exemple de l'électeur ci-dessus; nous devrions avoir autant d'affiliations de partis que d'âges. Si un composant de f est un vecteur, il sera forcé dans un facteur en lui appliquant le factor ().
L'opération effectuée par tapply () consiste à diviser x en groupes, chaque groupe correspondant à un niveau du facteur (ou une combinaison de niveaux des facteurs dans le cas de plusieurs facteurs), puis appliquer g ( ) aux sous-vecteurs résultants de x. Voici un petit exemple:
Examinons ce qui s'est passé. La fonction tapply () a traité le vecteur ("R", "D", "D", "R", "U", "D") comme facteur avec les niveaux "D", "R" et "U" . Il a noté que "D" se produisait dans les indices 2, 3 et 6; "R" s'est produit dans les indices 1 et 4; et "U" se sont produits dans l'indice 5. Pour plus de commodité, on se réfère respectivement aux trois vecteurs d'index (2,3,6), (1,4) et (5) comme x, y et z. Ensuite, tapply () compécialisé signifie (u [x]), signifie (u [y]) et signifie (u [z]) et renvoyé ces moyens dans un vecteur à trois éléments. Et les noms d'éléments de ce vecteur sont "D", "R" et "U", reflétant les niveaux de facteur utilisés par tapply ().
Et si nous avons deux ou plusieurs facteurs? Ensuite, chaque facteur produit un ensemble de groupes, comme dans l'exemple précédent, et les groupes sont gérés ensemble.
À titre d'exemple, supposons que nous disposions d'un ensemble de données économiques qui comprend des variables pour le genre, l'âge et le revenu. Ici, l'appel tapply (x, f, g) pourrait avoir x comme revenu et f comme une paire de facteurs: l'un pour le genre et l'autre codant si la personne est plus âgée ou plus jeune que 25. Nous pourrions être intéressés par trouver un revenu moyen, ventilé selon le sexe et l'âge. Si nous définissons g () comme mean(), tapply () renverra les revenus moyens dans chacun des quatre sous-groupes:
• Homme et moins de 25 ans
• Femmes et moins de 25 ans
• Homme et plus de 25 ans
• Femmes et plus de 25 ans
Voici un exemple de jouet de ce paramètre:
Nous avons spécifié deux facteurs, le sexe et l'indicateur variable pour un âge supérieur ou inférieur à 25. Étant donné que chacun de ces facteurs a deux niveaux, tapply () a divisé les données sur le revenu en quatre groupes, un pour chaque combinaison de genre et d'âge, puis appliqué à la fonction mean () à chaque groupe.
2 La fonction split ()
Contrairement à tapply (), qui divise un vecteur en groupes, puis applique une fonction spécifiée sur chaque groupe, split () s'arrête à cette première étape, en formant uniquement les groupes.
La forme de base, sans cloches et sifflets, est divisée (x, f), avec x et f jouant des rôles semblables à ceux de l'appel tapply (x, f, g); c'est-à-dire x étant un vecteur ou un cadre de données et f étant un facteur ou une liste de facteurs. L'action consiste à diviser x en groupes, qui sont renvoyés dans une liste. (Notez que x est autorisé à être un cadre de données avec split () mais pas avec tapply ().)
Essayons avec notre exemple précédent.
La sortie de split () est une liste, et rappelons que les composants de la liste sont indiqués par des signes de dollar. Ainsi, le dernier vecteur, par exemple, a été nommé "M.1" pour indiquer que c'était le résultat de la combinaison de "M" dans le premier facteur et 1 dans la seconde.
Dans une autre illustration, considérez notre exemple d'abeille à partir de la section 2.9.2. Nous voulions déterminer les indices des éléments vectoriels correspondant aux hommes, aux femmes et aux nourrissons. Les données contenues dans ce petit exemple sont composées du vecteur d'observation sept ("M", "F", "F", "I", "M", "M", "F"), affecté à g. Nous pouvons le faire en un éclair avec split ().
Les résultats montrent que les cas féminins sont dans les enregistrements 2, 3 et 7; l'affaire du nourrisson est au record 4; et les cas masculins sont dans les enregistrements 1, 5 et 6.
Disons cela étape par étape. Le vecteur g, pris comme facteur, comporte trois niveaux: "M", "F" et "I". Les indices correspondant au premier niveau sont 1, 5 et 6, ce qui signifie que g [1], g [5] et g [6] ont tous la valeur "M". Donc, R définit la composante M de la sortie aux éléments 1, 5 et 6 de 1: 7, qui est le vecteur (1,5,6).
Nous pouvons adopter une approche similaire pour simplifier le code dans notre exemple de concen- tration de texte de la section 4.2.4. Là, nous avons souhaité entrer un fichier texte, déterminer les mots dans le texte, puis afficher une liste indiquant les mots et leurs emplacements dans le texte. Nous pouvons utiliser split () pour rédiger le code comme suit:
L'appel de la fonction scan() renvoie une liste txt des mots lus à partir du fichier tf. Ainsi, txt [[1]] contiendra la première entrée de mot du fichier, txt [[2]] contiendra le deuxième mot, et ainsi de suite; longueur (txt) sera donc le nombre total de mots lus. Supposons pour le concret que ce chiffre soit 220.
Pendant ce temps, txt lui-même, comme deuxième argument en split () ci-dessus, sera considéré comme un facteur. Les niveaux de ce facteur seront les différents mots dans le fichier. Si, par exemple, le fichier contient le mot monde 6 fois et le climat était là 10 fois, alors «monde» et «climat» seront deux des niveaux de txt.
L'appel de split() déterminera alors où ces et les autres mots apparaissent dans txt.
3 La fonction by ()
Supposons que dans l'exemple de l'ormeau, nous souhaitons effectuer des analyses de régression de diamètres contre la longueur séparément pour chaque code de genre: mâles, femelles et nourrissons. Au début, cela semble être adapté pour tapply (), mais le premier argument de cette fonction doit être un vecteur, pas une matrice ou un cadre de données. La fonction à appliquer peut être multivariée - par exemple, gamme () - mais l'entrée doit être un vecteur. Pourtant, l'entrée pour la régression est une matrice (ou une trame de données) avec au moins deux colonnes: une pour la variable prédite et une ou plusieurs pour les variables prédictives. Dans notre application de données d'ormeaux, la matrice serait constituée d'une colonne pour les données de diamètre et d'une colonne de longueur.
La fonction by () peut être utilisée ici. Il fonctionne comme tapply () (qu'il appelle en interne, en fait), mais il est appliqué aux objets plutôt qu'aux vecteurs. Voici comment l'utiliser pour les analyses de régression souhaitées:
Les appels à par () ressemblent très bien aux appels à tapply (), avec le premier argument spécifiant nos données, le second étant le facteur de regroupement et le troisième la fonction à appliquer à chaque groupe.
Tout comme tapply () forme des groupes d'indices d'un vecteur selon les niveaux d'un facteur, cet appel par () trouve des groupes de nombres de lignes de la base de données aba. Cela crée trois cadres de sous-données: un pour chaque niveau de genre de M, F et I.
La fonction anonyme que nous avons définie regroupe la deuxième colonne de son argument matriciel m contre le t Troisième colonne. Cette fonction sera appelée trois fois, une fois pour chacune des trois images de sous-données créées précédemment, produisant ainsi les trois analyses de régression.