HOWTO · R

Convertire un fattore in valori numerici in R

Scopri come convertire in modo sicuro i fattori R in etichette numeriche, distinguere i codici dai valori e gestire le etichette non valide.

In questa pagina

Usa as.numeric(as.character(f)) quando un fattore f contiene etichette numeriche e vuoi ottenere quelle etichette come numeri. Una chiamata diretta a as.numeric(f) restituisce invece i codici interi interni del fattore. La conversione diretta è utile solo quando tali codici vengono usati intenzionalmente come identificatori di categoria.

Capire cosa restituisce as.numeric per un fattore

I fattori R contengono codici interi e un insieme separato di livelli testuali. I codici fanno riferimento ai livelli secondo l’ordine alfabetico o quello specificato esplicitamente; non rappresentano automaticamente le misurazioni originali. Puoi esaminare entrambe le parti con levels() e unclass().

L’output di as.numeric(f) è una sequenza di codici come 2 1 2 3. Non significa che i valori originali fossero 2, 1, 2 e 3. Questa distinzione è importante quando un data frame importa come fattore una colonna dall’aspetto numerico.

Convertire in numeri le etichette numeriche di un fattore

Converti prima il fattore in caratteri, quindi le etichette in valori numerici:

f <- factor(c("3", "2", "3", "4"))
values <- as.numeric(as.character(f))
values

Per un fattore i cui livelli sono certamente numerici, as.numeric(levels(f))[f] è un’alternativa efficiente. Entrambi gli approcci recuperano le etichette anziché i codici interni. La conversione prima in caratteri è in genere più leggibile e rende espliciti i due passaggi.

Le etichette numeriche decimali e negative funzionano nello stesso modo. Esegui la conversione vicino alla fase di importazione o pulizia e verifica il risultato con str() o class() prima di usarlo nei calcoli.

Codificare intenzionalmente le etichette categoriali

Se le etichette rappresentano categorie, non trattare i relativi codici come misurazioni. Definisci esplicitamente l’ordine delle categorie quando serve un identificatore stabile:

grade <- factor(c("low", "high", "low"), levels = c("low", "high"))
codes <- as.numeric(grade)
codes

Qui 1 e 2 sono codici di categoria perché l’ordine è stato scelto esplicitamente. Non indicano che high sia il doppio di low. Per una corrispondenza specifica dell’attività o del modello, una tabella di ricerca con nomi è più chiara:

grade <- c("low", "high", "low")
score <- c(low = 10, high = 20)[grade]
score

In questo modo il significato di ogni valore numerico rimane visibile e non dipende dall’ordine predefinito dei livelli del fattore.

Gestire etichette non numeriche, valori mancanti e avvisi

La conversione tramite caratteri non può trasformare etichette arbitrarie in numeri. Il testo non numerico diventa NA e R emette un avviso di coercizione; un valore già mancante rimane tale:

f <- factor(c("12.5", "oops", NA))
values <- as.numeric(as.character(f))
values
is.na(values)

Considera i valori NA imprevisti come un segnale di problemi nella qualità dei dati. Controlla le etichette originali, elimina o normalizza gli spazi quando necessario e decidi come gestire i record non validi prima dell’analisi. Non sostituirli silenziosamente con zero. Se le etichette sono categoriali anziché numeriche, usa una corrispondenza esplicita o un fattore con un ordine definito esplicitamente.

Verificare la conversione

Prima di fare affidamento sul risultato, controlla la classe di origine, i livelli, i valori convertiti e gli eventuali avvisi. La regola sintetica è:

  • usa as.numeric(f) per codici di fattore intenzionali;
  • usa as.numeric(as.character(f)) per etichette numeriche;
  • usa un ordine esplicito o una corrispondenza con nomi per le categorie; e
  • controlla i valori NA dopo la conversione del testo importato.

Il codice R moderno dovrebbe specificare intenzionalmente i tipi di importazione o i livelli del fattore, invece di dipendere dalle vecchie impostazioni predefinite sulla conversione delle stringhe in fattori. Questi controlli rendono chiaro il significato previsto di ogni risultato numerico.