L'un des types de données de base dans R est les facteurs. D'après mon expérience, les facteurs sont essentiellement une douleur et je ne les utilise jamais. Je me convertis toujours en personnages. J'ai l'impression de manquer quelque chose.
Existe-t-il des exemples importants de fonctions qui utilisent des facteurs comme variables de regroupement lorsque le type de données de facteur devient nécessaire? Y a-t-il des circonstances particulières dans lesquelles je devrais utiliser des facteurs?
r
language-design
internals
r-factor
JD Long
la source
la source
Réponses:
Vous devez utiliser des facteurs. Oui, ils peuvent être une douleur, mais ma théorie est que 90% de la raison pour laquelle ils sont une douleur est parce que dans
read.table
etread.csv
, l'argumentstringsAsFactors = TRUE
par défaut (et la plupart des utilisateurs manquent cette subtilité). Je dis qu'ils sont utiles parce que les packages d'ajustement de modèle comme lme4 utilisent des facteurs et des facteurs ordonnés pour ajuster différemment les modèles et déterminer le type de contrastes à utiliser. Et les packages graphiques les utilisent également pour les regrouper.ggplot
et la plupart des fonctions d'ajustement de modèle contraignent les vecteurs de caractères à des facteurs, de sorte que le résultat est le même. Cependant, vous vous retrouvez avec des avertissements dans votre code:Une chose délicate est le tout
drop=TRUE
. Dans les vecteurs, cela fonctionne bien pour supprimer les niveaux de facteurs qui ne sont pas dans les données. Par exemple:Cependant , avec
data.frame
s, le comportement de[.data.frame()
est différent: voir cet e-mail ou?"[.data.frame"
. Utiliserdrop=TRUE
ondata.frame
s ne fonctionne pas comme vous l'imaginez:Heureusement, vous pouvez facilement supprimer des facteurs avec
droplevels()
pour supprimer les niveaux de facteurs inutilisés pour un facteur individuel ou pour chaque facteur dans adata.frame
(depuis R 2.12):Voici comment éviter que les niveaux que vous avez sélectionnés ne figurent dans les
ggplot
légendes.En interne, les
factor
s sont des entiers avec un vecteur de caractère au niveau de l'attribut (voirattributes(iris$Species)
etclass(attributes(iris$Species)$levels)
), qui est propre. Si vous deviez changer un nom de niveau (et que vous utilisiez des chaînes de caractères), ce serait une opération beaucoup moins efficace. Et je change beaucoup de noms de niveau, surtout pour lesggplot
légendes. Si vous simulez des facteurs avec des vecteurs de caractères, vous risquez de ne modifier qu'un seul élément et de créer accidentellement un nouveau niveau distinct.la source
stringsAsFactors
n'est pas une fonction.les facteurs ordonnés sont géniaux, si j'aime les oranges et que je déteste les pommes mais que les raisins ne me dérangent pas, je n'ai pas besoin de gérer un index étrange pour le dire:
la source
d$f <- ordered(d$f, c("apples", "grapes", "oranges"))
faire? J'aurais deviné qu'il les a commandés dans la trame de données, mais après avoir exécuté cette ligne et imprimé la trame de données, rien ne change. Impose-t-il simplement un ordre interne même si l'ordre imprimé ne change pas?A
factor
est le plus analogue à un type énuméré dans d'autres langues. Son utilisation appropriée est pour une variable qui ne peut prendre que l'un des ensembles de valeurs prescrits. Dans ces cas, toutes les valeurs autorisées possibles peuvent ne pas être présentes dans un ensemble particulier de données et les niveaux «vides» reflètent exactement cela.Prenons quelques exemples. Pour certaines données collectées partout aux États-Unis, l'état doit être enregistré comme un facteur. Dans ce cas, le fait qu'aucune affaire n'a été collectée auprès d'un État particulier est pertinent. Il aurait pu y avoir des données de cet état, mais il est arrivé (pour une raison quelconque, qui peut être une raison d'intérêt) de ne pas l'être. Si la ville natale était recueillie, ce ne serait pas un facteur. Il n'y a pas un ensemble prédéfini de villes natales possibles. Si les données étaient collectées auprès de trois villes plutôt qu'au niveau national, la ville serait un facteur: il y a trois choix qui ont été donnés au départ et si aucun cas / donnée pertinent n'a été trouvé dans l'une de ces trois villes, c'est pertinent.
D'autres aspects de
factor
s, comme fournir un moyen de donner un ordre de tri arbitraire à un ensemble de chaînes, sont des caractéristiques secondaires utiles defactor
s, mais ne sont pas la raison de leur existence.la source
Les facteurs sont fantastiques quand on fait une analyse statistique et qu'on explore réellement les données. Cependant, avant cela, lorsque l'on lit, nettoie, dépanne, fusionne et manipule généralement les données, les facteurs sont une douleur totale. Plus récemment, comme au cours des dernières années, de nombreuses fonctions se sont améliorées pour mieux gérer les facteurs. Par exemple, rbind joue bien avec eux. Je trouve toujours une nuisance totale d'avoir laissé des niveaux vides après une fonction de sous-ensemble.
Je sais qu'il est simple de recoder les niveaux d'un facteur et de réorganiser les étiquettes et il existe également de merveilleuses façons de réorganiser les niveaux. Mon cerveau ne peut tout simplement pas s'en souvenir et je dois le réapprendre à chaque fois que je l'utilise. Le recodage devrait être beaucoup plus facile qu'il ne l'est.
Les fonctions de chaîne de R sont assez faciles et logiques à utiliser. Donc, lors de la manipulation, je préfère généralement les personnages aux facteurs.
la source
droplevels()
. Et il ne réorganise pas les facteurs par défaut.Quel titre sournois!
Je pense que de nombreuses fonctions d'estimation vous permettent d'utiliser des facteurs pour définir facilement des variables fictives ... mais je ne les utilise pas pour cela.
Je les utilise quand j'ai de très grands vecteurs de caractères avec peu d'observations uniques. Cela peut réduire la consommation de mémoire, en particulier si les chaînes du vecteur de caractères sont plus longues.
PS - Je plaisante sur le titre. J'ai vu votre tweet. ;-)
la source
?factor
elle était R-2.6.0 et il dit, "les valeurs entières sont stockées dans 4 octets alors que chaque référence à une chaîne de caractères a besoin d'un pointeur de 4 ou 8 octets." Économiseriez-vous de l'espace en convertissant en facteur si la chaîne de caractères avait besoin de 8 octets?N=100000
j'ai 391,5 Kb contre 391,8 Kb. Le facteur prend donc un peu plus de mémoire.Les facteurs sont un excellent moteur de badges "cas uniques". Je l'ai mal recréé plusieurs fois, et malgré quelques rides occasionnelles, elles sont extrêmement puissantes.
S'il y a une meilleure façon de faire cette tâche, j'adorerais la voir, je ne vois pas cette capacité de
factor
discussion.la source
tapply (et agrégé ) dépendent de facteurs. Le rapport information / effort de ces fonctions est très élevé.
Par exemple, dans une seule ligne de code (l'appel à tapply ci-dessous), vous pouvez obtenir le prix moyen des diamants par taille et couleur:
la source