Le nettoyage du taux de facteur (l'effondrement des niveaux multiples/étiquettes)
Ce qui est le plus efficace (c'est à dire efficace et appropriée) à un facteur contenant plusieurs niveaux qui doivent être effondrée? C'est, comment combiner deux ou plusieurs niveaux de facteur de dans un.
Voici un exemple où les deux niveaux de "Oui" et "Y" doit être effondré à "Oui" et "Non" et "N" s'est effondré "No":
## Given:
x <- c("Y", "Y", "Yes", "N", "No", "H") # The 'H' should be treated as NA
## expectedOutput
[1] Yes Yes Yes No No <NA>
Levels: Yes No # <~~ NOTICE ONLY **TWO** LEVELS
Une option est bien sûr pour nettoyer les cordes avant de la main à l'aide sub
et amis.
Une autre méthode, est de permettre un double de l'étiquette, puis déposez-les
## Duplicate levels ==> "Warning: deprecated"
x.f <- factor(x, levels=c("Y", "Yes", "No", "N"), labels=c("Yes", "Yes", "No", "No"))
## the above line can be wrapped in either of the next two lines
factor(x.f)
droplevels(x.f)
Cependant, est-il un moyen plus efficace?
Même si je sais que la levels
et labels
arguments doivent être des vecteurs, j'ai expérimenté avec des listes et nommé listes et nommé vecteurs pour voir ce qui se passe
Inutile de dire que rien de ce qui suit m'a plus près de mon but.
factor(x, levels=list(c("Yes", "Y"), c("No", "N")), labels=c("Yes", "No"))
factor(x, levels=c("Yes", "No"), labels=list(c("Yes", "Y"), c("No", "N")))
factor(x, levels=c("Y", "Yes", "No", "N"), labels=c(Y="Yes", Yes="Yes", No="No", N="No"))
factor(x, levels=c("Y", "Yes", "No", "N"), labels=c(Yes="Y", Yes="Yes", No="No", No="N"))
factor(x, levels=c("Yes", "No"), labels=c(Y="Yes", Yes="Yes", No="No", N="No"))
- N'ai pas testé encore, mais la R 3.5.0 (2018-04-23) notes de dire "facteur(x, niveaux, étiquettes) permet maintenant dupliqué étiquettes (non reproduit les niveaux!). Par conséquent, vous pouvez mapper les différentes valeurs de x pour le même niveau directement."
Vous devez vous connecter pour publier un commentaire.
Utiliser le
levels
de la fonction, et la passer à un nom de liste, avec les noms, les noms de votre choix sur les niveaux et les éléments actuellement l'un des noms qui devrait être renommé.Comme mentionné dans le
levels
de la documentation; voir aussi les exemples là.Cela peut aussi être fait en une seule ligne, que Marek ne ici: https://stackoverflow.com/a/10432263/210673; la
levels<-
la sorcellerie est expliqué ici https://stackoverflow.com/a/10491881/210673.factor
quoique....droplevles(factor(x, ...))
mais je reste curieux de toutes les méthodes plus directes. par exemple: S'il était possible d'utiliserlevels=<a named list>
droit dans lefactor(.)
appel)factor
; je ne sais pas de façon plus directe, sauf pour l'utilisation de quelque chose comme Ananda solution ou peut-être quelque chose avec le match.ordered
et l'effondrement des niveaux sont ordonnées comme ils sont fournis, par exemplea = ordered(c(1, 2, 3)); levels(a) = list("3" = 3, "1,2" = c(1, 2))
des rendements de l'ordreLevels: 3 < 1,2
.Que la question est intitulé Nettoyage de niveaux de facteurs (l'effondrement des niveaux multiples/étiquettes), le
forcats
package doit être mentionné ici, par souci d'exhaustivité.forcats
apparu sur CRAN en août 2016.Il y a plusieurs fonctions de confort disponibles pour le nettoyage de niveaux de facteurs:
Effondrement des niveaux de facteurs manuellement dans des groupes définis
Facteur de changement de niveaux en main
Automatiquement reclasser les taux de facteur, s'effondrer comme nécessaire
Noter que
fct_relabel()
fonctionne avec des niveaux de facteurs, de sorte qu'il s'attend à un facteur comme premier argument. Les deux autres fonctions,fct_collapse()
etfct_recode()
, accepter aussi d'un caractère de vecteur de qui est une fonctionnalité non documentée.Réorganiser les niveaux de facteur de par la première apparition
De la sortie attendue donné par l'OP est
Ici, les niveaux sont commandés tels qu'ils apparaissent dans
x
qui est différente de la valeur par défaut (?factor
: Les niveaux d'un facteur par défaut, sont triés).Pour être en ligne avec la sortie attendue, cela peut être réalisé en utilisant
fct_inorder()
avant s'effondrer les niveaux:Fois de retour de la sortie attendue avec les niveaux dans le même ordre, maintenant.
Peut-être un nom de vecteurs d'une touche peut-être d'utilisation:
Cela semble très similaire à votre dernière tentative... mais celui-ci fonctionne 🙂
unname
... ce pourrait bien prendre le gâteaux="N"
seul le "Non" de niveau sera affiché dans les résultats.levels
à lafactor
étape?Factor
de "SOfun" 🙂c(Y = "Yes", Yes = "Yes", N = "No", No = "No", H = NA) %>% { factor(unname(.[x]), levels = unique(.)) }
hein.Yes
,No
.Une autre façon est de faire un tableau contenant la cartographie:
Je préfère cette façon, puisqu'il laisse derrière facilement un objet inspecté résumant la carte; et les données.code de la table ressemble à toutes les autres rejoindre dans cette syntaxe.
Bien sûr, si vous ne voulez pas un objet comme
fmap
résumant le changement, il peut être un "one-liner":- Je ajouter à cette réponse de démontrer l'on a accepté la réponse de travailler sur un facteur spécifique dans un dataframe, puisque ce n'était pas d'abord une évidence pour moi (bien qu'il aurait probablement été).
Je ne sais pas votre réel de cas d'utilisation, mais serait
strtrim
être d'aucune utilité ici...Similaire à @Aaron approche, mais un peu plus simple serait:
Vous pouvez utiliser la sous fonction de la combinaison et l'effondrement de plusieurs facteurs:
Exemple:
Initialiser x
Vérifier la structure
Utiliser la fonction:
Vérifiez la structure:
D'abord notons que dans ce cas précis, nous pouvons utiliser la reconnaissance partielle:
Dans un cas plus général, j'irais avec
dplyr::recode
:Légèrement altérée si le point de départ est un facteur: