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í.

  • ???? ️ Struktura: Faktor obsahuje celočíselné kódy a atribut levels, takže každá kategorie je ověřena oproti pevnému seznamu.
  • 🧩 Stvoření: factor() převádí vektor znaků a class() potvrzuje změnu výsledku ze znaku na faktor.
  • 🔘 Nominální: Bez argumentu levels si R třídí kategorie sám, takže se nepředpokládá žádné řazení mezi barvami nebo pohlavími.
  • 📊 řadové: Předání ordered = TRUE s explicitním vektorem úrovní opraví pořadí od nejnižší po nejvyšší.
  • 🔢 kontinuální: Číselné a celočíselné sloupce zůstávají ve výchozím nastavení spojité, jak ukazuje class(mtcars$mpg).
  • ⚠️ Konverzní past: Funkce as.numeric() pro faktor vrací kódy úrovní, takže si nejprve přečtěte popisek pomocí funkce levels().
  • 🧠 Údržba: relevel() nastaví základní linii modelu a droplevels() vymaže kategorie, které zbyly po podmnožině.

Faktorizace kategoriální proměnné a spojité proměnné v R

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í.

Nejčastější dotazy

Pokud není zadán argument levels, funkce factor() zavolá unique() a seřadí hodnoty vzestupně. Toto řazení závisí na aktivní lokalitě, takže se nejedná vždy o čistý ASCII kód. Argument levels zadejte explicitně, kdykoli má argument order nějaký význam.

table(f) vrací pojmenovaný počet pro každou úroveň a prop.table(table(f)) převádí tyto počty na proporce. Oba udržují prázdné úrovně viditelné, což je činí užitečnými pro vyhledávání kategorií, které zmizely po filtrování. datový rámec.

Funkce factor() porovnává každý prvek s úrovněmi, které jste zadali, a jakákoli hodnota, která se neshoduje, se stane NA, místo aby vyvolala chybu. Před převodem zkontrolujte funkci setdiff(unique(x), your_levels) a sledujte volné mezery nebo různá velká písmena ve zdrojových datech.

cut() rozdělí číselný vektor v zadaných bodech zlomu a vrátí faktor. Pro čitelné názvy pásem předejte popisky a ordered_result = TRUE, pokud se pásma seřadí. findInterval() je rychlejší alternativa, když je potřeba pouze index přihrádky.

Od verze R 4.0.0 je výchozí tovární nastavení pro data.frame() a read.csv() stringsAsFactors = FALSE, takže textové sloupce zůstávají znakové. Starší skripty, které se spoléhaly na automatický převod, musí nyní volat factor() explicitně pro sloupce, které modelují.

Less než tomu bylo dříve. Referenční příručka k základnímu jazyku R uvádí, že identické řetězce nyní sdílejí úložiště, takže mezera je ve většině případů malá. Faktory se stále vyplácejí ověřováním kategorií a opravou pořadí úrovní používaných v modelech a grafech.

Většina modelovacích funkcí přijímá faktory přímo a automaticky vytváří fiktivní kontrasty, zatímco mnoho... strojové učení Balíčky očekávají numerickou matici. model.matrix() nebo kódování typu one-hot překlenují mezeru a uspořádaný faktor si může udržet své pořadí.

Ano. GitHub Copilot Funguje v RStudio 2023.09.0 a novějších verzích a navrhuje dokončení z komentářů a kódu v otevřeném souboru. Pořadí úrovní a zpracování numerických anod považujte za návrhy k ověření, nikoli za fakta.

Shrňte tento příspěvek takto: