Fattore in R: variabile categoriale e variabili continue
⚡ Riepilogo intelligente
In R, il linguaggio Factor memorizza i dati categorici come un vettore di codici interi associati a un insieme di livelli; è così che il linguaggio separa un gruppo limitato di categorie da una misurazione continua.

Cos'è il fattore in R?
Fattore in R Factor è una variabile utilizzata per categorizzare e memorizzare i dati, con un numero limitato di valori diversi. Memorizza i dati come un vettore di valori interi. In R, Factor è anche nota come variabile categoriale che memorizza valori di dati sia stringa che interi come livelli. Factor è utilizzata principalmente nella modellazione statistica e nell'analisi esplorativa dei dati con R.
Internamente un fattore è costituito da due oggetti che viaggiano insieme: un vettore intero di codici e un attributo di carattere denominato livelliOgni codice è una posizione in quel vettore di livelli, motivo per cui la stampa di un fattore mostra le parole mentre unclass() mostra i numeri.
In un set di dati, possiamo distinguere due tipi di variabili: categorico and continuo.
- Nelle statistiche descrittive per variabili categoriali in R, il valore è limitato e solitamente basato su un particolare gruppo finito. Ad esempio, una variabile categoriale in R può essere paesi, anno, sesso, occupazione.
- Una variabile continua, invece, può assumere qualsiasi valore, da intero a decimale. Ad esempio, possiamo avere il fatturato, il prezzo di un'azione, ecc.
Vale la pena proteggere questa distinzione, perché R sceglie silenziosamente impostazioni predefinite diverse per ciascuna. Una colonna numerica viene riepilogata con una media e una mediana, mentre un fattore viene riepilogato con conteggi per livello. Memorizzare una categoria come testo o come numero modifica quindi l'analisi che si ottiene. L'insieme più ampio delle modalità di memorizzazione è trattato nella guida a Tipi di dati e operatori in R.
Variabili categoriali
Variabili categoriali in R vengono memorizzati in un fattore. Vediamo il codice seguente per convertire una variabile di tipo carattere in una variabile di tipo fattore in R. Molte routine di modellazione e apprendimento automatico non possono elaborare testo non elaborato, quindi le categorie devono essere codificate come livelli o come numeri prima che il modello venga addestrato.
Sintassi
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
Il documento di riferimento base di R presenta due ulteriori argomenti che la forma abbreviata di cui sopra omette: escludere, che rimuove i valori prima che venga costruito il level set, e nmax, un limite superiore al numero di livelli che velocizza la conversione di vettori molto grandi.
Argomenti:
- x: Un vettore di dati categorici in R. Deve essere una stringa o un numero intero, non decimale.
- livelli: Un vettore di possibili valori assunti da x. Questo argomento è facoltativo. Il valore predefinito è l'elenco univoco degli elementi del vettore x, ordinati in ordine crescente.
- etichetteAggiungere un'etichetta ai dati categorici x in R. Ad esempio, 1 può assumere l'etichetta maschio mentre 0, l'etichetta femmina.
- escludere: Un vettore di valori da scartare durante la formazione del level set. I valori esclusi diventano NA nel risultato.
- ordinato: Un flag logico che determina se i livelli devono essere considerati ordinati, nell'ordine specificato.
- nmax: Un limite superiore opzionale al numero di livelli, utile per vettori lunghi.
Esempio:
Convertiamo un vettore di caratteri in un fattore e confermiamo la modifica con 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)
Produzione:
## [1] "character" ## [1] "factor"
La classe è passata da carattere a fattore e nulla è cambiato nei valori stampati. È importante trasformare un stringa in una variabile fattoriale in R prima di un'attività di apprendimento automatico, perché è a quel punto che le categorie diventano un insieme fisso e validato.
Una variabile categoriale in R può essere suddivisa in variabile categoriale nominale and variabile categoriale ordinale.
Variabile categoriale nominale
Una variabile categoriale nominale può assumere diversi valori, ma l'ordine non è rilevante. Ad esempio, maschio o femmina. In R, le variabili categoriali nominali non hanno alcun 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
Produzione:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
Dal parametro factor_color non possiamo dedurre alcun ordine. L'elenco dei livelli è in ordine alfabetico solo perché non è stato fornito alcun argomento per i livelli, quindi R ha ordinato automaticamente i valori univoci. Tale ordinamento segue le impostazioni locali attive anziché il semplice ASCII, il che è uno dei motivi per cui è opportuno specificare esplicitamente i livelli quando l'ordine è importante.
Variabile categoriale ordinale
Le variabili categoriche ordinali hanno un ordinamento naturale. La classificazione deriva dall'ordine del vettore passato al livelli L'argomento e l'impostazione ordered = TRUE indicano a R di trattare quella sequenza come una classifica piuttosto che come un semplice elenco. Impostare ordered = FALSE non inverte la classifica; produce semplicemente un normale fattore non ordinato. Per classificare dal più alto al più basso, invertire il vettore levels stesso.
Esempio:
Possiamo usare il riepilogo per contare i valori per ciascuna variabile fattore in 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
Produzione:
## [1] evening morning afternoon midday
midnight evening
La console stampa prima i valori e poi la classifica. Il blocco successivo si apre con la riga Levels, ancora commentata, in modo che la classifica rimanga visibile mentre la chiamata summary() viene aggiunta al codice precedente.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Produzione:
## morning midday afternoon evening midnight ## 1 1 1 2 1
R ha ordinato i livelli da "mattina" a "mezzanotte" come specificato nell'argomento levels. Poiché il fattore è ordinato, gli operatori di confronto come < e > funzionano anche su di esso, cosa che non accade con il fattore colore nominale sopra.
Variabili continue
In R, le variabili di classe continue sono il valore predefinito. Vengono memorizzate come numeriche o intere. Possiamo vederlo nel dataset qui sotto. mtcars è un dataset integrato che raccoglie informazioni su diversi tipi di auto. Possiamo importarlo usando mtcars e controllare la classe della variabile mpg, miglia per gallone. Restituisce un valore numerico, indicando una variabile continua.
dataset <- mtcars class(dataset$mpg)
Uscita
## [1] "numeric"
Non tutte le colonne numeriche sono effettivamente continue. Nello stesso dataset, la colonna "cyl" contiene solo i valori 4, 6 e 8, mentre la colonna "am" contiene solo i valori 0 e 1; entrambe sono quindi categorie memorizzate come numeri. La conversione tramite la funzione `factor()` prima della modellazione impedisce a R di interpretare l'intervallo tra 4 e 6 cilindri come una quantità misurata. L'operazione inversa, ovvero la suddivisione di una colonna continua in intervalli, viene gestita dalla funzione `cut()`.
Livelli e etichette dei fattori in R
L'attributo "livelli" è la parte di un fattore su cui impiegherete più tempo a intervenire, poiché controlla sia ciò che viene stampato sia ciò che un modello considera come linea di base. Quattro funzioni di supporto di base per R coprono quasi tutti i casi.
| Funzione | Ciò che fa | Utilizzo tipico |
|---|---|---|
| livelli(f) | Legge o sostituisce i nomi dei livelli | Rinominare le abbreviazioni in etichette leggibili |
| n livelli(f) | Restituisce il numero di livelli | Il controllo di una categoria non è esploso dopo un'unione |
| rilivello(f, ref) | Si sposta di un livello in avanti | Scelta della linea di base per una regressione |
| droplevels(f) | Rimuove i livelli con zero osservazioni | Pulizia dopo il subsetting o il filtraggio |
Il blocco sottostante applica tutti e quattro i fattori al colore e al genere creati in precedenza.
# 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])
Due dettagli meritano di essere ricordati. L'assegnazione a levels() rinomina in base alla posizione, quindi un vettore non corrispondente rinomina silenziosamente la categoria sbagliata. E un sottoinsieme mantiene ogni livello originale finché non viene chiamato droplevels(), motivo per cui un filtrato Frame dati è ancora possibile tracciare barre vuote. etichette L'argomento è ancora diverso: assegna un nome ai livelli al momento della creazione e le etichette duplicate uniscono più valori di input in un unico livello.
Come convertire un fattore in un valore numerico o carattere in R
Questo è il bug più comune relativo ai fattori in R. Poiché un fattore memorizza codici interi, la chiamata a `as.numeric()` restituisce tali codici anziché i valori che si possono visualizzare sullo schermo. Un fattore che rappresenta gli anni dal 2021 al 2023 viene restituito come 1, 2 e 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)
La documentazione di base di R raccomanda `as.numeric(levels(f))[f]` come percorso corretto e leggermente più veloce, mentre `as.numeric(as.character(f))` è l'equivalente più leggibile. Entrambi leggono prima l'etichetta e la convertono in seguito.
- Fattore per carattere: as.character(f) restituisce le etichette come testo semplice.
- Fattorizzare i codici interi: as.integer(f) o unclass(f) quando i codici sono quelli che desideri effettivamente.
- Caratteristica da fattore: factor(x) o la scorciatoia più veloce as.factor(x).
- Da numerico a fattore: factor(x) per codici discreti, cut(x, breaks) per valori continui che necessitano di suddivisione in bande.
Una misura di sicurezza si applica a tutti. Se un valore in x non appare nel vettore dei livelli, factor() imposta quell'elemento su NA invece di generare un errore, quindi uno spazio superfluo o una differenza di maiuscole/minuscole possono eliminare silenziosamente le righe. Confrontando i valori univoci prima e dopo la conversione, o ordinamento del data frame sulla nuova colonna, il problema viene messo in evidenza rapidamente.
Fattore vs Carattere vs Numerico in R: quando usare ciascuno
Scegliere la modalità di archiviazione fin dalle prime fasi consente di risparmiare molto tempo in fase di debug. La tabella confronta le tre modalità che una colonna di testo o di codice può assumere.
| Proprietà | Fattore | Carattere | Numerico |
|---|---|---|---|
| Conservato come | Codici interi più un attributo di livelli | String | Doublenumeri interi o s |
| Insieme fisso di valori | Sì, definito dai livelli | Non | Non |
| Ordine di visualizzazione personalizzato | Sì, attraverso i livelli | Solo in ordine alfabetico | Solo numerico |
| Aritmetica | Non è permesso | Non è permesso | Permesso |
| Contrasti tra modelli | Costruito automaticamente | Costringere prima | Trattata come una misura |
Utilizzare fattore quando i valori provengono da un elenco noto e chiuso, quando l'ordine di visualizzazione o di classificazione è importante o quando la colonna alimenta un modello o una legenda del grafico. Utilizzare carattere per testo libero, identificatori e qualsiasi cosa su cui analizzerai o unirai, come nomi, note e codici che continuano ad arrivare con nuovi valori. Usa numerico solo quando la distanza tra due valori è significativa.
Il riquadro sottostante mostra i metodi più rapidi per verificare cosa possiedi effettivamente.
# 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)
Due abitudini mantengono la scelta onesta. Esegui sapply(df, class) dopo ogni importazione, perché un singolo carattere fuori posto in una colonna numerica trasforma l'intera colonna in testo. E converti in un fattore il più tardi possibile, dopo che i dati sono stati puliti e uniti, in modo che dplyr Le operazioni di join e filtro confrontano ancora stringhe semplici anziché insiemi di livelli non corrispondenti.
