Współczynnik R: zmienna kategoryczna i zmienne ciągłe
⚡ Inteligentne podsumowanie
Funkcja Factor w języku R przechowuje dane kategoryczne w postaci wektora kodów całkowitych sparowanego z zestawem poziomów. W ten sposób język oddziela ograniczoną grupę kategorii od ciągłego pomiaru.

Co to jest współczynnik w R?
Czynnik w R to zmienna używana do kategoryzowania i przechowywania danych, mająca ograniczoną liczbę różnych wartości. Przechowuje dane jako wektor wartości całkowitych. Czynnik w R jest również znany jako zmienna kategoryczna, która przechowuje zarówno wartości ciągów znaków, jak i wartości całkowite jako poziomy. Czynnik jest najczęściej używany w modelowaniu statystycznym i eksploracyjnej analizie danych w R.
Wewnętrznie czynnik to dwa obiekty podróżujące razem: wektor całkowity kodów i atrybut znaku o nazwie poziomyKażdy kod jest pozycją w tym wektorze poziomów, dlatego drukowanie czynnika pokazuje słowa, podczas gdy usuń klasę() pokazuje liczby.
W zbiorze danych możemy wyróżnić dwa typy zmiennych: kategoryczny oraz ciągły.
- W statystyce opisowej zmiennych kategorycznych w R wartość jest ograniczona i zwykle opiera się na określonej skończonej grupie. Na przykład zmienną kategoryczną w R mogą być kraje, rok, płeć, zawód.
- Zmienna ciągła może jednak przyjmować dowolne wartości, od liczb całkowitych po liczby dziesiętne. Na przykład możemy mieć przychody, cenę akcji itd.
Warto zachować to rozróżnienie, ponieważ R automatycznie wybiera dla każdego z nich inne wartości domyślne. Kolumna liczbowa jest podsumowywana średnią i medianą, a czynnik – liczbą zliczeń na poziomie. Przechowywanie kategorii jako tekstu lub liczby zmienia zatem uzyskaną analizę. Szerszy zestaw trybów przechowywania omówiono w przewodniku. Typy danych i operatory R.
Zmienne kategorialne
Zmienne kategoryczne w R są przechowywane w czynniku. Sprawdźmy poniższy kod, aby przekonwertować zmienną znakową na zmienną czynnikową w R. Wiele procedur modelowania i uczenia maszynowego nie może przetwarzać surowego tekstu, dlatego kategorie muszą zostać zakodowane jako poziomy lub liczby przed dopasowaniem modelu.
Składnia
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
W dokumentacji podstawowej wersji R udokumentowano dwa kolejne argumenty, których skrócona wersja powyżej nie uwzględnia: wykluczaćktóry usuwa wartości przed utworzeniem zestawu poziomów i nmax, górna granica liczby poziomów, która przyspiesza konwersję bardzo dużych wektorów.
argumenty:
- x:Wektor danych kategorycznych w R. Musi być ciągiem znaków lub liczbą całkowitą, nie dziesiętną.
- poziomy: Wektor możliwych wartości przyjmowanych przez x. Ten argument jest opcjonalny. Wartością domyślną jest unikalna lista elementów wektora x, posortowanych rosnąco.
- Etykiety:Dodaj etykietę do danych kategorycznych x w R. Na przykład, 1 może przyjąć etykietę mężczyzna, a 0 etykietę kobieta.
- wykluczać:Wektor wartości do usunięcia po utworzeniu zestawu poziomów. Wykluczone wartości stają się wartościami NA w wyniku.
- zamówiony:Flaga logiczna określająca, czy poziomy należy traktować jako uporządkowane, zgodnie z podaną kolejnością.
- nmax:Opcjonalne górne ograniczenie liczby poziomów, przydatne w przypadku długich wektorów.
Przykład:
Przekształćmy wektor znaków na czynnik i potwierdźmy zmianę za pomocą class().
# Create gender vector gender_vector <- c("Male", "Female", "Female", "Male", "Male") class(gender_vector) # Convert gender_vector to a factor factor_gender_vector <-factor(gender_vector) class(factor_gender_vector)
Wyjście:
## [1] "character" ## [1] "factor"
Klasa przełączyła się ze znaku na czynnik, a nic w wydrukowanych wartościach się nie zmieniło. Ważne jest, aby przekształcić ciąg do zmiennej czynnikowej w R przed zadaniem uczenia maszynowego, ponieważ w tym momencie kategorie stają się ustalonym, sprawdzonym zestawem.
Zmienną kategoryczną w R można podzielić na nominalna zmienna kategoryczna oraz porządkowa zmienna kategoryczna.
Nominalna zmienna kategoryczna
Nominalna zmienna kategoryczna ma kilka wartości, ale ich kolejność nie ma znaczenia. Na przykład mężczyzna lub kobieta. Nominalne zmienne kategoryczne w R nie mają żadnego uporządkowania.
# Create a color vector color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow') # Convert the vector to factor factor_color <- factor(color_vector) factor_color
Wyjście:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
Na podstawie parametru factor_color nie możemy określić kolejności. Lista poziomów jest alfabetyczna tylko dlatego, że nie podano argumentu „levels”, więc R sam posortował unikalne wartości. To sortowanie jest zgodne z aktywnym ustawieniem regionalnym, a nie ze zwykłym kodem ASCII, co jest jednym z powodów, dla których poziomy należy jawnie określać, gdy kolejność ma znaczenie.
Porządkowa zmienna kategoryczna
Zmienne porządkowe kategoryczne mają naturalną kolejność. Ranking wynika z kolejności wektora przekazanego do poziomy Argument, a ordered = TRUE oznacza, że R traktuje tę sekwencję jako ranking, a nie pustą listę. Ustawienie ordered = FALSE nie odwraca rankingu; po prostu generuje zwykły nieuporządkowany czynnik. Aby uszeregować od najwyższego do najniższego, należy odwrócić sam wektor poziomów.
Przykład:
Możemy użyć podsumowania, aby policzyć wartości każdej zmiennej czynnikowej w R.
# Create Ordinal categorical vector day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening') # Convert `day_vector` to a factor with ordered level factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight')) # Print the new variable factor_day
Wyjście:
## [1] evening morning afternoon midday
midnight evening
Konsola najpierw wyświetla wartości, a pod nimi ranking. Kolejny blok otwiera się z wierszem „Levels”, nadal zakomentowanym, więc ranking pozostaje widoczny, podczas gdy wywołanie funkcji summary() jest dołączane do poprzedniego kodu.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Wyjście:
## morning midday afternoon evening midnight ## 1 1 1 2 1
R uporządkował poziom od „rano” do „północy”, zgodnie z argumentem „levels”. Ponieważ czynnik jest uporządkowany, operatory porównania, takie jak < i >, również na nim działają, czego nie robią w przypadku nominalnego czynnika koloru powyżej.
Zmienne ciągłe
Zmienne klasy ciągłej są wartością domyślną w R. Są one przechowywane jako liczby lub liczby całkowite. Widać to na poniższym zestawie danych. mtcars to wbudowany zbiór danych. Gromadzi on informacje o różnych typach samochodów. Możemy go zaimportować za pomocą mtcars i sprawdzić klasę zmiennej mpg (mila na galon). Zwraca wartość liczbową, co oznacza zmienną ciągłą.
dataset <- mtcars class(dataset$mpg)
Wydajność
## [1] "numeric"
Nie każda kolumna liczbowa jest rzeczywiście ciągła. W tym samym zbiorze danych cyl zawiera tylko wartości 4, 6 i 8, a am zawiera tylko 0 i 1, więc obie są kategoriami, które są przechowywane jako liczby. Konwersja tych wartości za pomocą funkcji factor() przed modelowaniem zapobiega traktowaniu przez R odstępu między 4 a 6 cylindrami jako wartości mierzonej. Ruch odwrotny, czyli podzielenie ciągłej kolumny na pasma, jest obsługiwany przez funkcję cut().
Poziomy czynników i etykiety w R
Atrybut poziomów to część współczynnika, na której dostosowywanie poświęcisz najwięcej czasu, ponieważ kontroluje on zarówno to, co jest drukowane, jak i to, co model traktuje jako linię bazową. Cztery podstawowe atrybuty pomocnicze R pokrywają niemal każdy przypadek.
| Funkcjonować | Co to robi | Typowe zastosowanie |
|---|---|---|
| poziomy(f) | Odczytuje lub zamienia nazwy poziomów | Zmiana nazw skrótów na czytelne etykiety |
| nlevels(f) | Zwraca liczbę poziomów | Sprawdzanie kategorii nie spowodowało eksplozji po dołączeniu |
| relevel(f, ref) | Przesuwa się o jeden poziom do przodu | Wybór punktu bazowego dla regresji |
| poziomy zrzutu(f) | Usuwa poziomy z zerową liczbą obserwacji | Czyszczenie po podzbiorze lub filtrowaniu |
Poniższy blok stosuje wszystkie cztery czynniki koloru i płci utworzone wcześniej.
# Inspect the levels of an existing factor levels(factor_color) # the level names, in the order R stored them nlevels(factor_color) # how many distinct levels exist # Rename the levels in place (the new vector must follow the same order) levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow') # Attach labels at creation time instead of renaming afterwards gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male')) # Make 'male' the reference level that modelling functions compare against gender_coded <- relevel(gender_coded, ref = 'male') # Remove levels that survived a subset but no longer occur in the data subset_color <- droplevels(factor_color[1:3])
Warto pamiętać o dwóch szczegółach. Przypisanie do levels() zmienia nazwy według pozycji, więc niedopasowany wektor po cichu zmienia etykiety niewłaściwej kategorii. A podzbiór zachowuje każdy oryginalny poziom do momentu wywołania droplevels(), dlatego filtrowane ramka danych nadal można wykreślać puste słupki. Etykiety Argument jest znowu inny: nadaje poziomom nazwy w momencie tworzenia, a zduplikowane etykiety łączą kilka wartości wejściowych w jeden poziom.
Jak przekonwertować czynnik na wartość liczbową lub znakową w R
To najczęstszy błąd czynnika w R. Ponieważ czynnik przechowuje kody całkowite, wywołanie funkcji as.numeric() zwraca te kody, a nie wartości widoczne na ekranie. Czynnik z lat 2021–2023 zwraca wartości 1, 2 i 3.
# A factor whose labels happen to look like numbers year_factor <- factor(c('2021', '2023', '2022', '2023')) # WRONG: this returns the internal codes 1, 3, 2, 3 - not the years as.numeric(year_factor) # RIGHT: read the label through the levels attribute first as.numeric(levels(year_factor))[year_factor] # Equivalent and easier to remember, but slightly slower as.numeric(as.character(year_factor)) # Back to plain text as.character(year_factor)
Podstawowa dokumentacja języka R zaleca as.numeric(levels(f))[f] jako poprawną i nieco szybszą ścieżkę, a as.numeric(as.character(f)) jako łatwiejszy do odczytania odpowiednik. Obie metody najpierw odczytują etykietę, a następnie konwertują.
- Współczynnik charakteru: as.character(f) zwraca etykiety jako zwykły tekst.
- Kody współczynnika na liczby całkowite: as.integer(f) lub unclass(f) gdy kody są tym, czego faktycznie chcesz.
- Charakter do czynnika: factor(x) lub szybszy skrót as.factor(x).
- Numeryczne na czynnikowe: współczynnik(x) dla kodów dyskretnych, cięcie(x, przerwy) dla wartości ciągłych wymagających podziału na pasma.
Jedno zabezpieczenie dotyczy wszystkich z nich. Jeśli wartość w x nie pojawia się w wektorze poziomów, factor() ustawia ten element na NA zamiast zgłaszać błąd, więc przypadkowa spacja lub różnica w kapitalizacji może dyskretnie usunąć wiersze. Porównywanie unikalnych wartości przed i po konwersji lub sortowanie ramki danych w nowej kolumnie szybko ujawnia problem.
Czynnik kontra znak kontra liczba w R: kiedy używać każdego z nich
Wczesny wybór trybu przechowywania znacznie oszczędza późniejsze debugowanie. Tabela porównuje trzy tryby, w jakich może być przechowywana kolumna tekstu lub kodów.
| Właściwość | Czynnik | Postać | Numeryczne |
|---|---|---|---|
| Zapisane jako | Kody całkowite plus atrybut poziomów | Smyczki | Doubles lub liczby całkowite |
| Stały zestaw wartości | Tak, zdefiniowane przez poziomy | Nie | Nie |
| Niestandardowa kolejność wyświetlania | Tak, przez poziomy | Tylko alfabetycznie | Tylko numeryczne |
| Arytmetyka | Niedozwolone | Niedozwolone | Dozwolony |
| Kontrasty modeli | Zbudowane automatycznie | Najpierw zmuszony | Traktowany jako pomiar |
Użyj czynnik gdy wartości pochodzą ze znanej, zamkniętej listy, gdy kolejność wyświetlania lub rankingowania ma znaczenie lub gdy kolumna zasila model lub legendę wykresu. Użyj charakter do dowolnego tekstu, identyfikatorów i wszystkiego, co będziesz analizować lub łączyć, na przykład nazw, notatek i kodów, które stale pojawiają się z nowymi wartościami. Użyj numeryczna tylko wtedy, gdy odległość między dwiema wartościami ma znaczenie.
Poniższy blok pokazuje najszybsze sposoby sprawdzenia, co faktycznie posiadasz.
# Ask R what each column of a data frame actually is sapply(mtcars, class) # Direct membership tests is.factor(factor_day) is.ordered(factor_day) # unclass() exposes the integer codes hiding behind the labels unclass(factor_color)
Dwa nawyki zapewniają uczciwość wyboru. Uruchom sapply(df, class) po każdym imporcie, ponieważ pojedynczy błąd w kolumnie liczbowej zamienia całą kolumnę w tekst. I przekonwertuj na czynnik jak najpóźniej, po oczyszczeniu i połączeniu danych, aby… dplyr połączenia i filtry nadal porównują zwykłe ciągi znaków, a nie niedopasowane zestawy poziomów.
