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.

  • 🏷️ struttura: Un fattore contiene codici interi e un attributo di livelli, in modo che ogni categoria venga convalidata rispetto a un elenco fisso.
  • 🧩 Creazione: factor() converte un vettore di caratteri e class() conferma che il risultato è stato convertito da carattere a fattore.
  • 🔘 Nominale: Senza un argomento "levels", R ordina automaticamente le categorie, quindi non viene implicita alcuna gerarchia tra colori o generi.
  • 📊 Ordinale: Passando ordered = TRUE con un vettore di livelli esplicito, la classifica viene fissata dal più basso al più alto.
  • 🔢 continua: Le colonne numeriche e intere rimangono continue per impostazione predefinita, come dimostra la classe (mtcars$mpg).
  • ⚠️ Trappola della conversione: La funzione as.numeric() applicata a un fattore restituisce i codici di livello, quindi è necessario leggere prima l'etichetta tramite levels().
  • 🧠 Manutenzione: relevel() imposta la baseline del modello e droplevels() elimina le categorie rimaste da un sottoinsieme.

Fattore R Variabile categoriale e variabili continue

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.

DOMANDE FREQUENTI

Quando il parametro levels non viene specificato, factor() chiama unique() e ordina i valori in ordine crescente. Tale ordinamento dipende dalle impostazioni locali attive, quindi non è sempre in formato ASCII semplice. Specificare esplicitamente l'argomento levels ogni volta che l'ordine è rilevante.

table(f) restituisce un conteggio denominato per ogni livello e prop.table(table(f)) converte quei conteggi in proporzioni. Entrambi mantengono visibili i livelli vuoti, il che li rende utili per individuare le categorie scomparse dopo il filtraggio. Frame dati.

factor() confronta ogni elemento con i livelli forniti e qualsiasi valore senza corrispondenza diventa NA anziché generare un errore. Controlla setdiff(unique(x), your_levels) prima della conversione e fai attenzione a spazi bianchi indesiderati o differenze di maiuscole/minuscole nei dati di origine.

La funzione `cut()` divide un vettore numerico nei punti di interruzione specificati e restituisce un fattore. Passare delle etichette per nomi di banda leggibili e impostare `ordered_result = TRUE` quando le bande sono classificate. La funzione `findInterval()` è un'alternativa più veloce quando è necessario solo l'indice del bin.

Dalla versione 4.0.0 di R, l'impostazione predefinita di fabbrica per data.frame() e read.csv() è stringsAsFactors = FALSE, quindi le colonne di testo rimangono di tipo carattere. Gli script più vecchi che si basavano sulla conversione automatica ora devono chiamare esplicitamente factor() sulle colonne che modellano.

Less rispetto a quanto accadeva in passato. La documentazione di riferimento di R base osserva che le stringhe identiche ora condividono lo spazio di archiviazione, quindi il divario è minimo nella maggior parte dei casi. I fattori risultano comunque utili per convalidare le categorie e per correggere l'ordine dei livelli utilizzati nei modelli e nei grafici.

La maggior parte delle funzioni di modellazione accetta direttamente i fattori e costruisce automaticamente i contrasti fittizi, mentre molte machine learning I pacchetti si aspettano una matrice numerica. model.matrix() o la codifica one-hot colmano questa lacuna e un fattore ordinato può mantenere il suo rango.

Sì. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Copilota GitHub Funziona con RStudio 2023.09.0 e versioni successive e suggerisce completamenti in base ai commenti e al codice nel file aperto. Considera l'ordine dei livelli e la gestione dei valori NA come suggerimenti da verificare, non come dati certi.

Riassumi questo post con: