R Academy · Lezione

Comprendere NA in R

Impari cosa significa NA, perché si propaga e in cosa differisce da NULL.

Lezione 1 di 413 passaggi

Comprendere NA in R è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento R Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso R Academy include 4 lezioni in totale.

Che cos'è NA in R?

NA sta per Not Available (non disponibile) e rappresenta un valore mancante o sconosciuto. A differenza di NULL (assenza di un oggetto) o NaN (non è un numero), NA è un segnaposto per dati che esistono, ma sono sconosciuti.

# NA represents a missing value
height_cm <- c(175, NA, 162, 188, NA, 170)
cat('Heights:', height_cm, '
')
cat('Length:', length(height_cm), '
')  # NA counts as an element
cat('Sum:', sum(height_cm), '
')        # NA propagates

NA e NULL

NA è un valore mancante all'interno di un vettore: la posizione esiste, ma non contiene un valore noto. NULL è invece la completa assenza di un oggetto: ha lunghezza 0 e non può essere memorizzato all'interno di un vettore.

# NA: element exists, value unknown
vec_with_na <- c(1, NA, 3)
cat('Vector with NA, length:', length(vec_with_na), '
')  # 3

# NULL: nothing there at all
vec_with_null <- c(1, NULL, 3)
cat('Vector with NULL, length:', length(vec_with_null), '
')  # 2!

# NULL gets dropped; NA is kept
cat('vec_with_na:', vec_with_na, '
')
cat('vec_with_null:', vec_with_null, '
')

NA e NaN

NaN (Not a Number, non è un numero) deriva da operazioni matematicamente non definite, come 0/0 o sqrt(-1). È un valore numerico speciale, mentre NA è un indicatore generico di valore mancante che può applicarsi a qualsiasi tipo.

# NaN from undefined operations
cat('0/0 =', 0/0, '
')          # NaN
cat('sqrt(-1) =', sqrt(-1), '
') # NaN (with warning)
cat('Inf - Inf =', Inf - Inf, '
') # NaN

# NaN IS also NA (a special case)
cat('is.nan(NaN):', is.nan(NaN), '
')
cat('is.na(NaN): ', is.na(NaN), '
')  # TRUE!
cat('is.nan(NA): ', is.nan(NA), '
')  # FALSE

NA rispetto a Inf

Inf e -Inf rappresentano l'infinito positivo e negativo: sono il risultato di operazioni come 1/0. A differenza di NA, Inf è un valore numerico noto, anche se estremo, e partecipa normalmente ai confronti.

cat('1/0 =', 1/0, '
')         # Inf
cat('-1/0 =', -1/0, '
')       # -Inf
cat('Inf + 1 =', Inf + 1, '
') # Inf
cat('Inf > 1000:', Inf > 1000, '
')  # TRUE
cat('is.infinite(Inf):', is.infinite(Inf), '
')
cat('is.na(Inf):       ', is.na(Inf), '
')  # FALSE

Propagazione di NA nelle operazioni aritmetiche

NA è contagioso nelle operazioni aritmetiche: qualsiasi operazione che coinvolga NA restituisce NA. Questo comportamento è intenzionale: se un valore in un calcolo è sconosciuto, anche il risultato è sconosciuto.

x <- NA
cat('NA + 5:  ', x + 5, '
')      # NA
cat('NA * 0:  ', x * 0, '
')      # NA (not 0!)
cat('NA == NA:', x == NA, '
')     # NA (not TRUE!)
cat('NA > 5:  ', x > 5, '
')      # NA
cat('sum(1,NA):', sum(1, NA), '
') # NA

typeof(NA) — NA tipizzati

Per impostazione predefinita, NA è di tipo logical. R fornisce varianti tipizzate di NA per ogni tipo atomico. Sono importanti quando si lavora con vettori tipizzati, per evitare conversioni di tipo indesiderate.

cat('typeof(NA):            ', typeof(NA), '
')           # logical
cat('typeof(NA_integer_):  ', typeof(NA_integer_), '
')   # integer
cat('typeof(NA_real_):     ', typeof(NA_real_), '
')      # double
cat('typeof(NA_complex_):  ', typeof(NA_complex_), '
')   # complex
cat('typeof(NA_character_):', typeof(NA_character_), '
') # character

NA_integer_ nella pratica

Quando crea un vettore intero con un valore mancante, utilizzi NA_integer_ per mantenere il tipo del vettore. In alcuni contesti, l'uso del semplice NA provoca una conversione implicita a double.

# Using plain NA in an integer vector
v1 <- c(1L, 2L, NA, 4L)
cat('typeof with NA:         ', typeof(v1), '
')  # integer (OK here)

# Explicit typed NA is safer in functions
v2 <- c(1L, 2L, NA_integer_, 4L)
cat('typeof with NA_integer_:', typeof(v2), '
')  # integer

# Check they behave the same
cat('Same?', identical(v1, v2), '
')

NA_real_ e NA_character_

NA_real_ si usa per i valori mancanti nei vettori double (numerici), mentre NA_character_ si usa per le stringhe mancanti. Sono particolarmente importanti quando si costruiscono vettori all'interno di funzioni, dove la coerenza del tipo è fondamentale.

# Character vector with missing
names_vec <- c('Alice', 'Bob', NA_character_, 'Dave')
cat('Names:', names_vec, '
')
cat('typeof:', typeof(names_vec), '
')

# Numeric with missing
readings <- c(22.5, NA_real_, 21.3, NA_real_, 24.1)
cat('Readings:', readings, '
')
cat('Non-NA count:', sum(!is.na(readings)), '
')

NA nelle operazioni logiche

La presenza di NA nelle operazioni logiche segue la logica a tre valori: TRUE | NA è TRUE (perché TRUE OR qualsiasi valore è TRUE), mentre FALSE | NA è NA (non possiamo determinare il risultato senza conoscere il valore di NA).

cat('TRUE  | NA:', TRUE | NA, '
')   # TRUE
cat('FALSE | NA:', FALSE | NA, '
')  # NA
cat('TRUE  & NA:', TRUE & NA, '
')   # NA
cat('FALSE & NA:', FALSE & NA, '
')  # FALSE

# Never use == to test for NA!
cat('NA == NA:', NA == NA, '
')    # NA (not TRUE!)
cat('is.na(NA):', is.na(NA), '
')  # TRUE (correct way)

NA nei vettori e nei data frame

I valori mancanti compaiono frequentemente nei dati reali. Comprendere il comportamento di NA aiuta a interpretare correttamente i riepiloghi, individuare i problemi di qualità dei dati e scegliere la strategia di gestione più adatta.

ages <- c(25, NA, 32, NA, 29, 41, NA, 35)
cat('Ages:', ages, '
')
cat('Length:', length(ages), '
')
cat('Missing count:', sum(is.na(ages)), '
')
cat('Present count:', sum(!is.na(ages)), '
')
cat('Mean (fails):', mean(ages), '
')           # NA
cat('Mean (works):', mean(ages, na.rm = TRUE), '
') # 32.4

Tipi di NA: quadro completo

Ecco un riepilogo dei valori speciali correlati a NA in R:

  • NA — valore mancante generico (tipo logical)
  • NA_integer_, NA_real_, NA_complex_, NA_character_ — NA tipizzati
  • NaN — numero non definito (risultato di 0/0, sqrt(-1))
  • Inf, -Inf — valori infiniti (risultato di 1/0)
  • NULL — assenza di un oggetto (lunghezza 0)
# Test functions for special values
x <- c(1, NA, NaN, Inf, -Inf, 0)
cat('Values:         ', x, '
')
cat('is.na():        ', is.na(x), '
')        # TRUE for NA and NaN
cat('is.nan():       ', is.nan(x), '
')       # TRUE only for NaN
cat('is.infinite():  ', is.infinite(x), '
')  # TRUE for Inf and -Inf
cat('is.finite():    ', is.finite(x), '
')    # TRUE only for normal numbers

Verifica rapida

A quale valore corrisponde NA == NA in R?

Riepilogo: comprendere NA

Ottimo! Ecco i concetti principali di questa lezione:

  • NA = valore mancante (si sa che esiste, ma il suo valore è sconosciuto)
  • NULL = assenza di un oggetto (viene escluso dai vettori)
  • NaN = risultato aritmetico non definito (è anche NA)
  • Inf / -Inf = valori infiniti (NON sono NA)
  • NA è contagioso nelle operazioni aritmetiche: le operazioni su NA restituiscono NA
  • Utilizzi NA tipizzati (NA_integer_, ecc.) per scrivere codice sicuro rispetto ai tipi
  • Verifichi sempre la presenza di NA con is.na(), mai con == NA
# Key tests side by side
special_vals <- list(NA=NA, NaN=NaN, Inf=Inf, 'NULL-in-vec'=c(1,NULL,3)[2])
for (name in names(special_vals)) {
  v <- special_vals[[name]]
  cat(name, '| is.na:', is.na(v), '| is.nan:', is.nan(v[!is.infinite(v)]), '
')
}
Gratis per iniziare

Impara R con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
43
Lezioni
159

Domande Frequenti

La lezione «Comprendere NA in R» è gratuita?

Sì — il testo completo di «Comprendere NA in R» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso R Academy, passa a CoddyKit PRO. Il corso R Academy include 4 lezioni in totale.

Cosa imparerò in «Comprendere NA in R»?

Impari cosa significa NA, perché si propaga e in cosa differisce da NULL. Eserciti R Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare R Academy?

Non è richiesta alcuna esperienza precedente. R Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Comprendere NA in R»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione R Academy?

Sì. Ogni lezione R Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Comprendere NA in R
  2. Rilevamento e conteggio dei valori mancanti
  3. Rimozione e sostituzione dei valori NA
  4. NA nei calcoli e nelle aggregazioni
← Torna a R Academy