Mam ramkę danych z niektórymi zmiennymi numerycznymi i niektórymi factor
zmiennymi kategorialnymi . Kolejność poziomów dla tych czynników nie jest taka, jaką bym chciał.
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
Jeśli zmienię kolejność poziomów, litery nie będą już z odpowiadającymi im numerami (moje dane są kompletnie bezsensowne od tego momentu).
levels(df$letters) <- c("d", "c", "b", "a")
df
# numbers letters
# 1 1 d
# 2 2 c
# 3 3 b
# 4 4 a
Chcę po prostu zmienić kolejność poziomów , więc podczas kreślenia słupki są wyświetlane w żądanej kolejności - która może różnić się od domyślnej kolejności alfabetycznej.
Odpowiedzi:
Użyj
levels
argumentufactor
:źródło
trochę więcej, tak dla przypomnienia
Możesz również znaleźć przydatne Relevel i connect_factor .
źródło
reorder(df$letters, seq(4,1))
Ponieważ to pytanie było ostatnio aktywne, Hadley opublikował swój nowy
forcats
pakiet do manipulowania czynnikami i uważam go za niezwykle przydatny. Przykłady z ramki danych PO:Aby odwrócić poziomy:
Aby dodać więcej poziomów:
I wiele innych przydatnych
fct_xxx()
funkcji.źródło
df %>% mutate(letters = fct_rev(letters))
.więc w leksykonie R chcesz zmienić tylko etykiety dla danej zmiennej czynnikowej (tj. pozostawić dane oraz poziomy czynników niezmienione).
biorąc pod uwagę, że chcesz zmienić tylko mapowanie punktu danych do etykiety, a nie dane lub schemat czynników (w jaki sposób punkty danych są kategoryzowane w poszczególnych pojemnikach lub wartościach czynników, warto wiedzieć, w jaki sposób mapowanie jest pierwotnie ustawione podczas tworzenia Czynnik.
zasady są proste:
źródło
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:
Teraz, jeśli zamienisz ten współczynnik na liczbowy, otrzymasz:
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):
Zauważ, że możesz również nazwać Cię za
data.frame
pomocądf
iletters
zamiastg
, 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ędzyfactor(g, levels = letters[4:1])
ifactor(g, labels = letters[4:1])
? Co jest podobne wlevels(g) <- letters[4:1]
ig <- 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 ...źródło
Chciałbym dodać kolejny przypadek, w którym poziomy mogą być łańcuchami zawierającymi liczby wraz z kilkoma znakami specjalnymi: jak na poniższym przykładzie
Domyślne poziomy
x
to:Tutaj, jeśli chcemy zmienić kolejność poziomów czynników zgodnie z wartością liczbową, bez jawnego zapisywania poziomów, moglibyśmy zrobić
Mam nadzieję, że można to uznać za przydatną informację dla przyszłych czytelników.
źródło
Oto moja funkcja zmiany kolejności czynników w danej ramce danych:
Stosowanie:
reorderFactors(df, "my_col", desired_level_order = c("how","I","want"))
źródło