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:
> numbers = 1:4
> letters = factor(letters[1:4])
> dtf <- data.frame(numbers, letters)
> dtf
numbers letters
1 1 a
2 2 b
3 3 c
4 4 d
> sapply(dtf, class)
numbers letters
"integer" "factor"
Wenn Sie diesen Faktor in numerisch umwandeln, erhalten Sie:
# return underlying numerical values
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
# change levels
1> levels(dtf$letters) <- letters[4:1]
1> dtf
numbers letters
1 1 d
2 2 c
3 3 b
4 4 a
# return numerical values once again
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
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 factorvon @Jonathan Chang vorgeschlagene Funktion verwenden, passiert etwas anderes: Sie ändern die numerischen Werte selbst.
Sie erhalten erneut einen Fehler, weil Sie dies tun levelsund dann versuchen, ihn mit neu zu bewerten factor. Tu es nicht !!! Sie nicht verwenden , levelsoder 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 ( dfist Dichtefunktion für die F-Verteilung, lettersgibt 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):
> dtf <- data.frame(f = 1:4, g = factor(letters[1:4]))
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 1 2 3 4
> dtf$g <- factor(dtf$g, levels = letters[4:1])
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 4 3 2 1
Beachten Sie, dass Sie Sie auch data.framemit dfund lettersanstelle von benennen können gund das Ergebnis in Ordnung ist. Tatsächlich ist dieser Code mit dem von Ihnen geposteten identisch, nur die Namen werden geändert. Dieser Teil factor(dtf$letter, levels = letters[4:1])würde keinen Fehler auslösen, kann aber verwirrend sein!
Lesen Sie das ?factorHandbuch sorgfältig durch! Was ist der Unterschied zwischen factor(g, levels = letters[4:1])und factor(g, labels = letters[4:1])? Was ist ähnlich in levels(g) <- letters[4:1]und g <- factor(g, labels = letters[4:1])?
Sie können die ggplot-Syntax verwenden, damit wir Ihnen in diesem Fall weiterhelfen können!
Prost!!!
Bearbeiten:
ggplot2erfordert eigentlich, sowohl Ebenen als auch Werte zu ändern? Hm ... ich werde das hier ausgraben ...