Ich habe einen Datenrahmen mit einigen numerischen Variablen und einigen kategorialen factor
Variablen. Die Reihenfolge der Ebenen für diese Faktoren ist nicht so, wie ich sie haben möchte.
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
Wenn ich die Reihenfolge der Ebenen ändere, sind die Buchstaben nicht mehr mit den entsprechenden Zahlen versehen (meine Daten sind ab diesem Zeitpunkt völliger Unsinn).
levels(df$letters) <- c("d", "c", "b", "a")
df
# numbers letters
# 1 1 d
# 2 2 c
# 3 3 b
# 4 4 a
Ich mag einfach das ändern Ebene um, so beim Plotten, die Stangen in der gewünschten Reihenfolge angezeigt - was von Standard alphabetischer Reihenfolge abweichen.
Antworten:
Verwenden Sie das
levels
Argument vonfactor
:quelle
einige mehr, nur für die Aufzeichnung
Möglicherweise finden Sie auch nützliche Relevel- und Kombinationsfaktoren .
quelle
reorder(df$letters, seq(4,1))
Seit diese Frage zuletzt aktiv war, hat Hadley sein neues
forcats
Paket zur Manipulation von Faktoren veröffentlicht, und ich finde es unglaublich nützlich. Beispiele aus dem Datenrahmen des OP:So kehren Sie die Ebenen um:
So fügen Sie weitere Ebenen hinzu:
Und viele weitere nützliche
fct_xxx()
Funktionen.quelle
df %>% mutate(letters = fct_rev(letters))
.so , was Sie wollen, in R Lexikon, ist nur die Änderungen Etiketten für einen bestimmten Faktor Variablen (dh, lassen Sie die Daten als auch die Faktorstufen , unverändert).
Da Sie nur die Zuordnung von Datenpunkt zu Beschriftung und nicht die Daten oder das Faktorschema ändern möchten (wie die Datenpunkte in einzelne Fächer oder Faktorwerte unterteilt werden, ist es möglicherweise hilfreich zu wissen, wie die Zuordnung ursprünglich festgelegt wurde, als Sie sie zum ersten Mal erstellen der Faktor.
Die Regeln sind einfach:
quelle
Der Umgang mit Faktoren in R ist eine ziemlich eigenartige Aufgabe, muss ich zugeben ... Während Sie die Faktorstufen neu ordnen, ordnen Sie die zugrunde liegenden numerischen Werte nicht neu. Hier ist eine kleine Demonstration:
Wenn Sie diesen Faktor in numerisch umwandeln, erhalten Sie:
Wie Sie sehen können ... ändern Sie durch Ändern der Ebenen nur die Ebenen (wer würde das sagen, was?), Nicht die numerischen Werte! Wenn Sie jedoch die
factor
von @Jonathan Chang vorgeschlagene Funktion verwenden, passiert etwas anderes: Sie ändern die numerischen Werte selbst.Sie erhalten erneut einen Fehler, weil Sie dies tun
levels
und dann versuchen, ihn mit neu zu bewertenfactor
. Tu es nicht !!! Sie nicht verwenden ,levels
oder Sie werden durcheinander zu bringen (es sei denn , Sie wissen genau , was Sie tun).Ein kleiner Vorschlag: Vermeiden Sie es, Ihre Objekte mit einem identischen Namen wie die Objekte von R zu benennen (
df
ist Dichtefunktion für die F-Verteilung,letters
gibt Kleinbuchstaben an). In diesem speziellen Fall wäre Ihr Code nicht fehlerhaft, aber manchmal kann es sein ... aber dies kann Verwirrung stiften, und das wollen wir nicht, oder?!? =)Verwenden Sie stattdessen so etwas (ich gehe noch einmal von Anfang an):
Beachten Sie, dass Sie Sie auch
data.frame
mitdf
undletters
anstelle von benennen könneng
und das Ergebnis in Ordnung ist. Tatsächlich ist dieser Code mit dem von Ihnen geposteten identisch, nur die Namen werden geändert. Dieser Teilfactor(dtf$letter, levels = letters[4:1])
würde keinen Fehler auslösen, kann aber verwirrend sein!Lesen Sie das
?factor
Handbuch sorgfältig durch! Was ist der Unterschied zwischenfactor(g, levels = letters[4:1])
undfactor(g, labels = letters[4:1])
? Was ist ähnlich inlevels(g) <- letters[4:1]
undg <- factor(g, labels = letters[4:1])
?Sie können die ggplot-Syntax verwenden, damit wir Ihnen in diesem Fall weiterhelfen können!
Prost!!!
Bearbeiten:
ggplot2
erfordert eigentlich, sowohl Ebenen als auch Werte zu ändern? Hm ... ich werde das hier ausgraben ...quelle
Ich möchte einen weiteren Fall hinzufügen, in dem die Ebenen Zeichenfolgen sein könnten, die Zahlen zusammen mit einigen Sonderzeichen tragen: wie im folgenden Beispiel
Die Standardwerte von
x
sind:Wenn wir hier die Faktorstufen gemäß dem numerischen Wert neu anordnen möchten, ohne die Stufen explizit aufzuschreiben, können wir Folgendes tun
Ich hoffe, dass dies als nützliche Information für zukünftige Leser angesehen werden kann.
quelle
Hier ist meine Funktion, um Faktoren eines bestimmten Datenrahmens neu zu ordnen:
Verwendung:
reorderFactors(df, "my_col", desired_level_order = c("how","I","want"))
quelle