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 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 bewerten factor
. 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):
> 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.frame
mit df
und letters
anstelle von benennen können g
und 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 ?factor
Handbuch 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:
ggplot2
erfordert eigentlich, sowohl Ebenen als auch Werte zu ändern? Hm ... ich werde das hier ausgraben ...