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

