Radzenie sobie z czynnikami w R jest dość dziwną pracą, muszę przyznać ... Zmieniając kolejność poziomów czynników, nie zmieniasz kolejności podstawowych wartości liczbowych. Oto mała demonstracja:
> 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"
Teraz, jeśli zamienisz ten współczynnik na liczbowy, otrzymasz:
# 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
Jak widzisz ... zmieniając poziomy, zmieniasz tylko poziomy (kto by to powiedział, co?), A nie wartości liczbowe! Ale kiedy używasz factorfunkcji, jak sugerował @Jonathan Chang, dzieje się coś innego: zmieniasz same wartości liczbowe.
Ponownie otrzymujesz błąd, ponieważ robisz to, levelsa następnie próbujesz go dopasować factor. Nie rób tego !!! Czy nie używać levelsalbo będziesz rzeczy bałagan (chyba że dokładnie wiesz co robisz).
Jedna sugestia: unikaj nazywania swoich obiektów identyczną nazwą jak obiekty R ( dfjest funkcją gęstości dla rozkładu F, lettersdaje małe litery alfabetu). W tym konkretnym przypadku twój kod nie byłby wadliwy, ale czasami może być ... ale może to spowodować zamieszanie, a tego nie chcemy, prawda?!? =)
Zamiast tego użyj czegoś takiego (jeszcze raz przejdę od początku):
> 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
Zauważ, że możesz również nazwać Cię za data.framepomocą dfi letterszamiast g, a wynik będzie OK. Właściwie ten kod jest identyczny z tym, który opublikowałeś, zmieniane są tylko nazwy. Ta część factor(dtf$letter, levels = letters[4:1])nie spowodowałaby błędu, ale może być myląca!
Przeczytaj ?factoruważnie instrukcję! Jaka jest różnica między factor(g, levels = letters[4:1])i factor(g, labels = letters[4:1])? Co jest podobne w levels(g) <- letters[4:1]i g <- factor(g, labels = letters[4:1])?
Możesz wprowadzić składnię ggplot, abyśmy mogli Ci bardziej pomóc w tym!
Twoje zdrowie!!!
Edytować:
ggplot2faktycznie wymaga zmiany zarówno poziomów, jak i wartości? Hm ... wykopię to ...