J'ai une base de données avec des variables numériques et des factor
variables catégorielles . L'ordre des niveaux de ces facteurs n'est pas celui que je souhaite.
numbers <- 1:4
letters <- factor(c("a", "b", "c", "d"))
df <- data.frame(numbers, letters)
df
# numbers letters
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
Si je change l'ordre des niveaux, les lettres ne sont plus avec leurs numéros correspondants (mes données sont totalement absurdes à partir de maintenant).
levels(df$letters) <- c("d", "c", "b", "a")
df
# numbers letters
# 1 1 d
# 2 2 c
# 3 3 b
# 4 4 a
Je veux simplement changer l' ordre des niveaux , donc lors du traçage, les barres sont affichées dans l'ordre souhaité - qui peut différer de l'ordre alphabétique par défaut.
Réponses:
Utilisez l'
levels
argument defactor
:la source
un peu plus, juste pour mémoire
Vous pouvez également trouver utile Relevel et combine_factor .
la source
reorder(df$letters, seq(4,1))
Depuis que cette question était pour la dernière fois active, Hadley a publié son nouveau
forcats
package pour manipuler les facteurs et je le trouve scandaleusement utile. Exemples de la trame de données de l'OP:Pour inverser les niveaux:
Pour ajouter plus de niveaux:
Et bien d'autres
fct_xxx()
fonctions utiles .la source
df %>% mutate(letters = fct_rev(letters))
.donc ce que vous voulez, dans le lexique R, est de ne changer que les étiquettes pour une variable de facteur donnée (c'est-à-dire, laissez les données ainsi que les niveaux de facteur , inchangés).
étant donné que vous souhaitez modifier uniquement le mappage point de données à étiquette et non les données ou le schéma de facteur (comment les points de données sont regroupés dans des groupes individuels ou des valeurs de facteur, il peut être utile de savoir comment le mappage est initialement défini lors de la création initiale le facteur.
les règles sont simples:
la source
Traiter les facteurs dans R est un travail assez particulier, je dois admettre ... Tout en réorganisant les niveaux de facteur, vous ne réorganisez pas les valeurs numériques sous-jacentes. Voici une petite démonstration:
Maintenant, si vous convertissez ce facteur en numérique, vous obtiendrez:
Comme vous pouvez le voir ... en changeant de niveau, vous ne changez que les niveaux (qui le dirait, hein?), Pas les valeurs numériques! Mais, lorsque vous utilisez la
factor
fonction comme @Jonathan Chang l'a suggéré, quelque chose de différent se produit: vous changez les valeurs numériques elles-mêmes.Vous obtenez une fois de plus une erreur parce que vous le faites
levels
et essayez ensuite de la revaloriserfactor
. Ne fais pas ça !!! Ne pas utiliserlevels
ou vous allez tout gâcher (sauf si vous savez exactement ce que vous faites).Une petite suggestion: évitez de nommer vos objets avec un nom identique aux objets de R (
df
est la fonction de densité pour la distribution F,letters
donne des lettres minuscules de l'alphabet). Dans ce cas particulier, votre code ne serait pas défectueux, mais parfois il peut l'être ... mais cela peut créer de la confusion, et nous ne voulons pas de cela, n'est-ce pas?!? =)Au lieu de cela, utilisez quelque chose comme ça (je vais recommencer depuis le début):
Notez que vous pouvez également vous nommer
data.frame
avecdf
etletters
au lieu deg
, et le résultat sera OK. En fait, ce code est identique à celui que vous avez posté, seuls les noms sont modifiés. Cette partiefactor(dtf$letter, levels = letters[4:1])
ne ferait pas d'erreur, mais elle peut être déroutante!Lisez
?factor
attentivement le manuel! Quelle est la différence entrefactor(g, levels = letters[4:1])
etfactor(g, labels = letters[4:1])
? Qu'est-ce qui est similaire danslevels(g) <- letters[4:1]
etg <- factor(g, labels = letters[4:1])
?Vous pouvez mettre la syntaxe ggplot, afin que nous puissions vous aider davantage sur celui-ci!
À votre santé!!!
Éditer:
ggplot2
nécessite réellement de changer les niveaux et les valeurs? Hm ... je vais creuser celui-ci ...la source
Je souhaite ajouter un autre cas où les niveaux pourraient être des chaînes portant des nombres avec quelques caractères spéciaux: comme l'exemple ci-dessous
Les niveaux par défaut de
x
sont:Ici, si nous voulons réorganiser les niveaux de facteur en fonction de la valeur numérique, sans écrire explicitement les niveaux, ce que nous pourrions faire est
J'espère que cela peut être considéré comme une information utile pour les futurs lecteurs.
la source
Voici ma fonction pour réorganiser les facteurs d'un dataframe donné:
Usage:
reorderFactors(df, "my_col", desired_level_order = c("how","I","want"))
la source