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 factor
funkcji, jak sugerował @Jonathan Chang, dzieje się coś innego: zmieniasz same wartości liczbowe.
Ponownie otrzymujesz błąd, ponieważ robisz to, levels
a następnie próbujesz go dopasować factor
. Nie rób tego !!! Czy nie używać levels
albo będziesz rzeczy bałagan (chyba że dokładnie wiesz co robisz).
Jedna sugestia: unikaj nazywania swoich obiektów identyczną nazwą jak obiekty R ( df
jest funkcją gęstości dla rozkładu F, letters
daje 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.frame
pomocą df
i letters
zamiast 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 ?factor
uważ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ć:
ggplot2
faktycznie wymaga zmiany zarówno poziomów, jak i wartości? Hm ... wykopię to ...