Factorul în R: variabile categorice și variabile continue

⚡ Rezumat inteligent

Factor în R stochează datele categorice ca un vector de coduri întregi asociate cu un set de niveluri, acesta fiind modul în care limbajul separă un grup limitat de categorii de o măsurare continuă.

  • 🏷️ Structura: Un factor conține coduri întregi plus un atribut levels, astfel încât fiecare categorie este validată în funcție de o listă fixă.
  • 🧩 Creare: factor() convertește un vector de caractere, iar class() confirmă rezultatul modificat de la caracter la factor.
  • 🔘 Nominal: Fără un argument pentru niveluri, R sortează categoriile singur, deci nu este implicată nicio clasificare între culori sau sexe.
  • 📊 Ordinal: Transmiterea ordinului ordered = TRUE cu un vector de niveluri explicit fixează clasamentul de la cel mai mic la cel mai mare.
  • 🔢 Continuu: Coloanele numerice și întregi rămân continue în mod implicit, așa cum demonstrează class(mtcars$mpg).
  • ⚠️ Capcana conversiei: as.numeric() pe un factor returnează codurile de nivel, așadar citiți mai întâi eticheta până la levels().
  • 🧠 Întreținere: relevel() setează linia de bază a modelului, iar droplevels() șterge categoriile rămase în urmă de un subset.

Factorizarea variabilelor categorice și continue R

Ce este factorul în R?

Factorul în R este o variabilă utilizată pentru a clasifica și stoca datele, având un număr limitat de valori diferite. Stochează datele ca un vector de valori întregi. Factor în R este cunoscut și ca o variabilă categorică ce stochează atât valori de date de tip șir, cât și de tip întreg ca niveluri. Factor este utilizat în principal în modelarea statistică și analiza exploratorie a datelor cu R.

Intern, un factor este reprezentat de două obiecte care călătoresc împreună: un vector întreg de coduri și un atribut de caracter numit nivelurile deFiecare cod reprezintă o poziție în vectorul de nivel, motiv pentru care afișarea unui factor afișează cuvinte în timp ce declasează() arată numere.

Într-un set de date, putem distinge două tipuri de variabile: categoric și continuu.

  • În statistica descriptivă pentru variabilele categoriale din R, valoarea este limitată și, de obicei, se bazează pe un anumit grup finit. De exemplu, o variabilă categorială din R poate fi țări, anul, sexul, ocupația.
  • O variabilă continuă, însă, poate lua orice valori, de la număr întreg la zecimal. De exemplu, putem avea venitul, prețul unei acțiuni etc.

Această distincție merită respectată, deoarece R alege în mod silențios valori implicite diferite pentru fiecare. O coloană numerică este rezumată cu o medie și o mediană, în timp ce un factor este rezumat cu numărări pe nivel. Stocarea unei categorii ca text sau ca număr modifică, prin urmare, analiza obținută. Setul mai larg de moduri de stocare este prezentat în ghidul pentru Tipuri de date și operatori R.

Variabile categoriale

Variabilele categoriale în R sunt stocate într-un factor. Să verificăm codul de mai jos pentru a converti o variabilă de tip caracter într-o variabilă de tip factor în R. Multe rutine de modelare și învățare automată nu pot consuma text brut, așa că categoriile trebuie codificate ca niveluri sau ca numere înainte ca modelul să fie ajustat.

Sintaxă

factor(x = character(), levels, labels = levels, ordered = is.ordered(x))

Referința de bază R documentează două argumente suplimentare pe care forma prescurtată de mai sus le omite: exclude, care elimină valorile înainte de construirea setului de niveluri și Vmax, o limită superioară a numărului de niveluri care accelerează conversia vectorilor foarte mari.

argumente:

  • xUn vector de date categorice în R. Trebuie să fie un șir de caractere sau un număr întreg, nu zecimal.
  • nivelurile deUn vector de valori posibile luate de x. Acest argument este opțional. Valoarea implicită este lista unică de elemente ale vectorului x, sortate crescător.
  • eticheteAdăugați o etichetă la datele categorice x din R. De exemplu, 1 poate lua eticheta masculin, în timp ce 0, eticheta feminin.
  • excludeUn vector de valori care trebuie eliminate atunci când setul de nivel este format. Valorile excluse devin NA în rezultat.
  • ordonatUn indicator logic care determină dacă nivelurile ar trebui considerate ca fiind ordonate, în ordinea dată.
  • VmaxO limită superioară opțională pentru numărul de niveluri, utilă pentru vectori lungi.

Exemplu:

Să convertim un vector de caractere într-un factor și să confirmăm modificarea cu 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)

ieșire:

## [1] "character"
## [1] "factor"

Clasa a trecut de la caracter la factor și nimic din valorile imprimate nu s-a schimbat. Este important să transformi un şir într-o variabilă factorială în R înaintea unei sarcini de învățare automată, deoarece acesta este punctul în care categoriile devin un set fix, validat.

O variabilă categorială din R poate fi împărțită în variabilă categorială nominală și variabilă categorială ordinală.

Variabila categorica nominala

O variabilă categorică nominală are mai multe valori, dar ordinea nu contează. De exemplu, masculin sau feminin. Variabilele categorice nominale din R nu au nicio ordine.

# 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

ieșire:

## [1] blue   red    green  white  black  yellow
## Levels: black blue green red white yellow

Din factor_color, nu putem stabili nicio ordine. Lista de niveluri este alfabetică doar pentru că nu a fost furnizat niciun argument levels, așa că R a sortat singur valorile unice. Această sortare urmează locale-ul activ mai degrabă decât ASCII simplu, acesta fiind unul dintre motivele pentru a enunța nivelurile explicit ori de câte ori ordinea contează.

Variabilă categorială ordinală

Variabilele categorice ordinale au o ordine naturală. Clasificarea provine din ordinea vectorului transmis către nivelurile de argument, iar ordered = TRUE îi spune lui R să trateze acea secvență ca pe un clasament, mai degrabă decât ca pe o listă simplă. Setarea ordered = FALSE nu inversează clasamentul; pur și simplu produce un factor neordonat obișnuit. Pentru a clasifica de la cel mai mare la cel mai mic, inversați vectorul de niveluri în sine.

Exemplu:

Putem folosi sumarul pentru a număra valorile pentru fiecare variabilă factor din 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

ieșire:

## [1] evening   morning   afternoon midday    
midnight  evening

Consola afișează mai întâi valorile și clasamentul dedesubt. Următorul bloc se deschide cu acea linie Levels, încă comentată, astfel încât clasamentul rămâne vizibil în timp ce apelul summary() este adăugat la codul anterior.

## Levels: morning < midday < afternoon < evening < midnight
# Append the line to above code
# Count the number of occurence of each level
summary(factor_day)

ieșire:

##   morning    midday afternoon   evening  midnight
##         1         1         1         2         1

R a ordonat nivelul de la „dimineață” la „miezul nopții”, așa cum este specificat în argumentul niveluri. Deoarece factorul este ordonat, operatorii de comparație precum < și > lucrează și ei asupra lui, lucru pe care nu îl fac asupra factorului de culoare nominal de mai sus.

Variabile continue

Variabilele de clasă continue sunt valoarea implicită în R. Acestea sunt stocate ca numere numerice sau întregi. Putem vedea acest lucru din setul de date de mai jos. mtcars este un set de date încorporat. Acesta colectează informații despre diferite tipuri de mașini. Îl putem importa folosind mtcars și verifică clasa variabilei mpg, mile per galon. Returnează o valoare numerică, indicând o variabilă continuă.

dataset <- mtcars
class(dataset$mpg)

producție

## [1] "numeric"

Nu fiecare coloană numerică este cu adevărat continuă. În același set de date, `cyl` conține doar 4, 6 și 8, iar `am` conține doar 0 și 1, deci ambele sunt categorii care sunt stocate ca numere. Convertirea lor cu `factor()` înainte de modelare împiedică R să trateze spațiul dintre 4 și 6 cilindri ca o cantitate măsurată. Mișcarea inversă, tăierea unei coloane continue în benzi, este gestionată de `cut()`.

Niveluri și etichete ale factorilor în R

Atributul levels este partea unui factor pe care o veți petrece cel mai mult timp ajustând-o, deoarece controlează atât ce se imprimă, cât și ce tratează un model ca referință. Patru atribute de bază R acoperă aproape fiecare caz.

Funcţie Ce face Utilizare tipică
niveluri (f) Citește sau înlocuiește numele nivelurilor Redenumirea abrevierilor în etichete lizibile
nlevels(f) Returnează numărul de niveluri Verificarea faptului că o categorie nu a explodat după o îmbinare
renivelare(f, ref) Se mută cu un nivel în față Alegerea liniei de bază pentru o regresie
niveluri de scădere (f) Elimină nivelurile cu zero observații Curățarea după subsetare sau filtrare

Blocul de mai jos aplică toate cele patru factorilor de culoare și gen creați anterior.

# 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])

Două detalii merită ținute minte. Atribuirea către levels() redenumește după poziție, astfel încât un vector nepotrivit redenumește în mod silențios categoria greșită. Și un subset păstrează fiecare nivel original până când este apelat droplevels(), motiv pentru care o funcție filtrată cadru de date se pot reprezenta în continuare bare goale. etichete Argumentul este din nou diferit: denumește nivelurile la momentul creării, iar etichetele duplicate îmbină mai multe valori de intrare într-un singur nivel.

Cum se convertește un factor în numeric sau caracter în R

Aceasta este cea mai frecventă eroare de factorizare în R. Deoarece un factor stochează coduri întregi, apelarea funcției as.numeric() returnează acele coduri în loc de valorile pe care le puteți vedea pe ecran. Un factor pentru anii 2021 până la 2023 returnează 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)

Documentația de bază R recomandă as.numeric(levels(f))[f] ca rută corectă și puțin mai rapidă, iar as.numeric(as.character(f)) ca echivalent mai ușor de citit. Ambele citesc mai întâi eticheta și convertesc ulterior.

  • Factorul de caracteras.character(f) returnează etichetele ca text simplu.
  • Factorizarea codurilor în numere întregias.integer(f) sau unclass(f) atunci când codurile sunt ceea ce doriți de fapt.
  • Caracter de factorizat: factor(x) sau comanda rapidă as.factor(x).
  • Numeric pentru a factoriza: factor(x) pentru coduri discrete, cut(x, breaks) pentru valori continue care necesită bandă.

O singură măsură de siguranță se aplică tuturor. Dacă o valoare din x nu apare în vectorul de niveluri, factor() setează acel element la NA în loc să genereze o eroare, astfel încât un spațiu rătăcit sau o diferență de scriere cu majuscule poate șterge discret rândurile. Compararea valorilor unice înainte și după conversie sau sortarea cadrului de date pe noua coloană, expune rapid problema.

Factor vs. Caracter vs. Numeric în R: Când se utilizează fiecare

Alegerea timpurie a modului de stocare economisește multă depanare ulterioară. Tabelul compară cele trei moduri pe care le poate lua o coloană de text sau coduri.

Proprietatea Factor Caracter Numeric
Stocat ca Coduri întregi plus un atribut levels Corzi Doubles sau numere întregi
Set fix de valori Da, definit pe niveluri Nu Nu
Ordine de afișare personalizată Da, prin niveluri Numai în ordine alfabetică Numai numeric
Aritmetică Nu sunt permise Nu sunt permise Permis
Contraste de modele Construit automat Mai întâi constrâns Tratat ca o măsurătoare

Folosi factor când valorile provin dintr-o listă închisă, cunoscută, când ordinea de afișare sau de clasare contează sau când coloana alimentează un model sau o legendă a graficului. Se utilizează caracter pentru text liber, identificatori și orice veți analiza sau conecta, cum ar fi nume, note și coduri care sosesc în mod repetat cu valori noi. Folosiți numeric numai atunci când distanța dintre două valori este semnificativă.

Blocul de mai jos prezintă cele mai rapide metode de a verifica ce aveți de fapt.

# 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)

Două obiceiuri mențin alegerea corectă. Rulează sapply(df, class) după fiecare import, deoarece un singur caracter rătăcit într-o coloană numerică transformă întreaga coloană în text. Și convertește într-un factor cât mai târziu posibil, după ce datele sunt curățate și unite, astfel încât dplyr Join-urile și filtrele compară în continuare șiruri simple, în loc de seturi de nivel nepotrivite.

Întrebări frecvente

Când nu se furnizează argumentul levels, factor() apelează unique() și sortează valorile în ordine crescătoare. Această sortare depinde de localizarea activă, deci nu este întotdeauna ASCII simplu. Furnizați argumentul levels explicit ori de câte ori ordinea are o semnificație.

table(f) returnează un număr denumit pentru fiecare nivel, iar prop.table(table(f)) convertește aceste numărări în proporții. Ambele păstrează nivelurile goale vizibile, ceea ce le face utile pentru identificarea categoriilor care au dispărut după filtrarea unui cadru de date.

factor() potrivește fiecare element cu nivelurile furnizate, iar orice valoare fără potrivire devine NA în loc să genereze o eroare. Verificați setdiff(unique(x), your_levels) înainte de conversie și fiți atenți la spații albe rătăcite sau la majuscule diferite în datele sursă.

cut() împarte un vector numeric la punctele de întrerupere pe care le dai și returnează un factor. Transmite etichete pentru nume de benzi lizibile și ordered_result = TRUE când benzile sunt clasificate. findInterval() este o alternativă mai rapidă atunci când este necesar doar indexul bin.

Începând cu versiunea R 4.0.0, valoarea implicită din fabrică pentru data.frame() și read.csv() este stringsAsFactors = FALSE, deci coloanele de text rămân de tip caracter. Scripturile mai vechi care se bazau pe conversia automată trebuie acum să apeleze explicit factor() pe coloanele pe care le modelează.

Less decât o făceau odinioară. Referința de bază R menționează că șirurile identice partajează acum spațiul de stocare, deci diferența este mică în majoritatea cazurilor. Factorii continuă să fie avantajoși prin validarea categoriilor și prin fixarea ordinii nivelurilor utilizate în modele și grafice.

Majoritatea funcțiilor de modelare acceptă factori direct și construiesc automat contraste fictive, în timp ce multe masina de învățare Pachetele așteaptă o matrice numerică. model.matrix() sau codificarea one-hot elimină decalajul, iar un factor ordonat își poate păstra clasamentul.

Da. Copilotul GitHub Funcționează în RStudio 2023.09.0 și versiuni ulterioare și sugerează completări din comentariile și codul din fișierul deschis. Tratați ordinea nivelurilor și gestionarea NA ca sugestii de verificare, nu ca fapte.

Rezumați această postare cu: