Faktor v R: Kategorická proměnná a spojité proměnné
⚡ Chytré shrnutí
Faktor v R ukládá kategorická data jako vektor celočíselných kódů spárovaných se sadou úrovní, což je způsob, jakým jazyk odděluje omezenou skupinu kategorií od spojitého měření.

Co je faktor v R?
Faktor v R je proměnná používaná ke kategorizaci a ukládání dat s omezeným počtem různých hodnot. Ukládá data jako vektor celočíselných hodnot. Faktor v R je také známý jako kategoriální proměnná, která ukládá řetězcové i celočíselné datové hodnoty jako úrovně. Faktor se nejčastěji používá ve statistickém modelování a průzkumné analýze dat v R.
Interně je faktor dva objekty, které se pohybují společně: celočíselný vektor kódů a atribut znaku s názvem úrovníKaždý kód je pozicí v daném vektoru úrovní, a proto se při tisku faktoru zobrazují slova, zatímco unclass() ukazuje čísla.
V datové sadě můžeme rozlišit dva typy proměnných: kategorický a nepřetržitý.
- V popisné statistice pro kategorické proměnné v R je hodnota omezená a obvykle je založena na konkrétní konečné grupě. Například kategorickou proměnnou v R mohou být země, rok, pohlaví, povolání.
- Spojitá proměnná však může nabývat libovolných hodnot, od celočíselných až po desetinné. Můžeme například znát tržby, cenu akcie atd.
Toto rozlišení stojí za to si uvědomit, protože R tiše volí pro každý z nich různé výchozí hodnoty. Číselný sloupec je shrnut pomocí průměru a mediánu, zatímco faktor je shrnut pomocí počtů na úroveň. Uložení kategorie jako textu nebo čísla proto mění analýzu, kterou získáte. Širší sada režimů ukládání je popsána v průvodci k... Datové typy a operátory R.
Kategorické proměnné
Kategorické proměnné v R jsou uloženy do faktoru. Podívejme se na níže uvedený kód, který v jazyce R převede znakovou proměnnou na faktorovou proměnnou. Mnoho modelovacích a strojových učební rutin nedokáže zpracovávat surový text, takže kategorie musí být před přizpůsobením modelu zakódovány jako úrovně nebo čísla.
Syntax
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
Základní referenční dokumentace R dokumentuje dva další argumenty, které výše zkrácená forma vynechává: vyloučit, který odstraní hodnoty před sestavením sady úrovní a nmax, horní hranice počtu úrovní, která urychluje převod velmi velkých vektorů.
argumenty:
- xVektor kategorických dat v R. Musí to být řetězec nebo celé číslo, nikoli desetinné číslo.
- úrovníVektor možných hodnot proměnné x. Tento argument je volitelný. Výchozí hodnota je jedinečný seznam položek vektoru x, seřazený vzestupně.
- etiketyPřidejte popisek k kategoriálním datům x v R. Například 1 může mít popisek muž, zatímco 0 může mít popisek žena.
- vyloučitVektor hodnot, které se mají vynechat při vytvoření sady úrovní. Vyloučené hodnoty se ve výsledku stanou NA.
- objednanéLogický příznak, který určuje, zda by úrovně měly být považovány za seřazené v daném pořadí.
- nmax: Volitelná horní hranice počtu úrovní, užitečná pro dlouhé vektory.
Příklad:
Převeďme vektor znaků na faktor a změnu potvrdíme 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)
Výstup:
## [1] "character" ## [1] "factor"
Třída přešla ze znaku na faktor a nic na vytištěných hodnotách se nezměnilo. Je důležité transformovat a šňůra do faktorové proměnné v R před úlohou strojového učení, protože to je bod, ve kterém se kategorie stávají pevnou, validovanou sadou.
Kategorickou proměnnou v R lze rozdělit na nominální kategoriální proměnná a ordinální kategoriální proměnná.
Nominální kategorická proměnná
Nominální kategoriální proměnná má několik hodnot, ale pořadí nehraje roli. Například muž nebo žena. Nominální kategoriální proměnné v R nemají žádné pořadí.
# 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
Výstup:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
Z argumentu factor_color nelze určit žádné pořadí. Seznam úrovní je abecední, protože nebyl zadán argument levels, takže R seřadil jedinečné hodnoty sám. Toto řazení se řídí aktivním locale, nikoli čistým ASCII kódem, což je jeden z důvodů, proč explicitně uvádět úrovně, kdykoli je důležité pořadí.
Řadová kategorická proměnná
Ordinální kategoriální proměnné mají přirozené uspořádání. Pořadí vychází z pořadí vektoru předaného proměnné. úrovní argument a ordered = TRUE říká R, aby s touto sekvencí zacházel jako s pořadím, nikoli jako s holým seznamem. Nastavení ordered = FALSE nezmění pořadí; jednoduše vytvoří obyčejný neuspořádaný faktor. Chcete-li seřadit od nejvyšší po nejnižší, obraťte samotný vektor úrovní.
Příklad:
K počítání hodnot pro každou proměnnou faktoru v R můžeme použít souhrn.
# 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
Výstup:
## [1] evening morning afternoon midday
midnight evening
Konzole nejprve vypíše hodnoty a pod nimi pořadí. Další blok se otevře s řádkem Levels, stále zakomentovaným, takže pořadí zůstane viditelné, zatímco se k předchozímu kódu připojí volání summary().
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Výstup:
## morning midday afternoon evening midnight ## 1 1 1 2 1
R seřadil úroveň od „rána“ do „půlnoci“, jak je uvedeno v argumentu levels. Protože je faktor seřazený, pracují s ním i porovnávací operátory jako < a >, což nefunguje s výše uvedeným nominálním barevným faktorem.
Spojité proměnné
Proměnné třídy Continuous jsou v R výchozí hodnotou. Jsou uloženy jako číselné nebo celočíselné. Vidíme to z níže uvedené datové sady. mtcars je vestavěná datová sada. Shromažďuje informace o různých typech automobilů. Můžeme ji importovat pomocí mtcars a zkontrolovat třídu proměnné mpg, mile per gallon. Vrací číselnou hodnotu, která označuje spojitou proměnnou.
dataset <- mtcars class(dataset$mpg)
Výstup
## [1] "numeric"
Ne každý číselný sloupec je skutečně spojitý. Ve stejné datové sadě cyl obsahuje pouze hodnoty 4, 6 a 8 a am pouze hodnoty 0 a 1, takže obě kategorie jsou uloženy jako čísla. Jejich převod pomocí factor() před modelováním zabrání R v tom, aby mezeru mezi 4 a 6 válci považoval za měřenou veličinu. Opačný pohyb, rozdělení spojitého sloupce na pásy, je řešen funkcí cut().
Úrovně faktorů a popisky v R
Atribut levels je část faktoru, které budete při úpravách věnovat nejvíce času, protože řídí jak to, co se vytiskne, tak i to, co model považuje za základní linii. Čtyři základní R pomocné atributy pokrývají téměř každý případ.
| funkce | Co to dělá | Typické použití |
|---|---|---|
| úrovně (f) | Přečte nebo nahradí názvy úrovní | Přejmenování zkratek na čitelné popisky |
| nlevels(f) | Vrátí počet úrovní | Kontrola kategorie se po spojení nerozložila. |
| převyrovnej(f, ref) | Posune se o jednu úroveň dopředu | Výběr základní linie pro regresi |
| droplevels(f) | Odstraní úrovně s nulovými pozorováními | Čištění po oddělování nebo filtrování |
Níže uvedený blok aplikuje všechny čtyři na dříve vytvořené faktory barvy a pohlaví.
# 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])
Za zapamatování stojí dva detaily. Přiřazení k levels() přejmenuje podle pozice, takže neshodný vektor tiše přejmenuje nesprávnou kategorii. A podmnožina si zachovává každou původní úroveň, dokud není zavolána droplevels(), což je důvod, proč filtrovaný datový rámec stále může vykreslovat prázdné sloupce. etikety Argument je opět jiný: pojmenovává úrovně v době vytváření a duplicitní popisky slučují několik vstupních hodnot do jedné úrovně.
Jak převést faktor na číslo nebo znak v R
Toto je nejčastější chyba faktorů v R. Protože faktor ukládá celočíselné kódy, volání as.numeric() na něj vrací tyto kódy, nikoli hodnoty, které vidíte na obrazovce. Faktor let 2021 až 2023 se vrací jako 1, 2 a 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)
Základní dokumentace R doporučuje as.numeric(levels(f))[f] jako správnou a o něco rychlejší cestu a as.numeric(as.character(f)) jako snáze čitelný ekvivalent. Oba přečtou nejprve popisek a poté převedou.
- Faktor k charakteruFunkce as.character(f) vrací popisky jako prostý text.
- Faktorizační kódy na celočíselné číslo: as.integer(f) nebo unclass(f), když kódy skutečně odpovídají vašim požadavkům.
- Znak k rozkladu: factor(x) nebo rychlejší zkratka as.factor(x).
- Číselný rozklad na součin: factor(x) pro diskrétní kódy, cut(x, breaks) pro spojité hodnoty, které potřebují pásmování.
Jedna pojistka platí pro všechny. Pokud se hodnota v x neobjevuje ve vektoru úrovní, funkce factor() nastaví tento prvek na NA, místo aby vyvolala chybu, takže bludná mezera nebo rozdíl ve velkých písmenech mohou tiše smazat řádky. Porovnávání jedinečných hodnot před a po převodu, nebo třídění datového rámce v novém sloupci rychle odhalí problém.
Faktor vs. znak vs. číslo v R: Kdy použít každý z nich
Včasná volba režimu ukládání ušetří pozdější ladění. Tabulka porovnává tři režimy, které může sloupec textu nebo kódu nabývat.
| Vlastnictví | Faktor | Znak | Číselný |
|---|---|---|---|
| Uloženo jako | Celočíselné kódy plus atribut levels | Strings | Doubles nebo celá čísla |
| Pevná sada hodnot | Ano, definováno úrovněmi | Ne | Ne |
| Vlastní pořadí zobrazení | Ano, prostřednictvím úrovní | Pouze abecedně | Pouze číselné |
| Aritmetický | Není povoleno | Není povoleno | Povoleno |
| Kontrasty modelů | Automaticky sestaveno | Nejprve donuceni | Považáno za měření |
Použití faktor když hodnoty pocházejí ze známého uzavřeného seznamu, když záleží na pořadí zobrazení nebo pořadí, nebo když sloupec poskytuje model nebo legendu grafu. Použijte znak pro volný text, identifikátory a cokoli, co budete analyzovat nebo k čemu se připojovat, jako jsou jména, poznámky a kódy, které neustále přicházejí s novými hodnotami. Použijte numeric pouze tehdy, když je vzdálenost mezi dvěma hodnotami smysluplná.
Níže uvedený blok ukazuje nejrychlejší způsoby, jak zkontrolovat, co skutečně máte.
# 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)
Dva návyky zajišťují poctivou volbu. Spouštět sapply(df, class) po každém importu, protože jediný chybějící znak v číselném sloupci převede celý sloupec na text. A převádět na faktor co nejpozději, až po vyčištění a spojení dat, aby dplyr Spoje a filtry stále porovnávají prosté řetězce, nikoli neshodné sady úrovní.
