0Pricing
R Academy · Lezione

NA nei calcoli e nelle aggregazioni

Controlli il comportamento di NA in mean(), sum() e nelle altre funzioni aggregate.

NA nei calcoli e nelle aggregazioni è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 4 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.

Il parametro na.rm

La maggior parte delle funzioni di aggregazione di R accetta un argomento na.rm (rimozione degli NA). Quando è impostato su TRUE, la funzione ignora i valori NA prima di calcolare il risultato. Per impostazione predefinita, na.rm = FALSE, quindi gli NA vengono propagati.

scores <- c(88, NA, 72, 95, NA, 81, 67)
cat('With na.rm=FALSE (default):
')
cat('  mean:', mean(scores), '
')           # NA
cat('  sum: ', sum(scores), '
')            # NA
cat('With na.rm=TRUE:
')
cat('  mean:', mean(scores, na.rm = TRUE), '
')  # 80.6
cat('  sum: ', sum(scores, na.rm = TRUE), '
')   # 403

mean() con na.rm

mean(x, na.rm = TRUE) calcola la media aritmetica dei valori non mancanti. Il denominatore è il numero di valori presenti, non la lunghezza totale.

temperatures <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)

cat('Total elements:', length(temperatures), '
')
cat('Present elements:', sum(!is.na(temperatures)), '
')
cat('Mean (na.rm=TRUE):', mean(temperatures, na.rm = TRUE), '
')

# Manual verification
cat('Manual mean:', sum(temperatures, na.rm=TRUE) / sum(!is.na(temperatures)), '
')

sum() con na.rm

sum(x, na.rm = TRUE) somma solo i valori non-NA. È essenziale per contare i valori TRUE in un vettore logico che può contenere NA o per calcolare i totali a partire da dati incompleti.

sales_daily <- c(1200, NA, 980, 1450, NA, 1100, 890)
cat('Sum (default):', sum(sales_daily), '
')            # NA
cat('Sum (na.rm):  ', sum(sales_daily, na.rm = TRUE), '
')  # 5620

# Count observations meeting a condition (NA-safe)
cat('Days over 1000:', sum(sales_daily > 1000, na.rm = TRUE), '
')

min() e max() con na.rm

Anche min() e max() dispongono del parametro na.rm. Senza questo parametro, un singolo NA nell'input fa sì che la funzione restituisca NA. Con na.rm = TRUE, vengono restituiti i valori estremi tra quelli presenti.

blood_pressure <- c(120, NA, 135, 118, NA, 142, 125, NA, 130)
cat('Max BP (default):', max(blood_pressure), '
')              # NA
cat('Max BP (na.rm):  ', max(blood_pressure, na.rm = TRUE), '
')  # 142
cat('Min BP (na.rm):  ', min(blood_pressure, na.rm = TRUE), '
')  # 118
cat('Range (na.rm):   ', range(blood_pressure, na.rm = TRUE), '
')

var() e sd() con na.rm

Anche la varianza (var()) e la deviazione standard (sd()) supportano na.rm. Calcolano la statistica utilizzando solo le osservazioni non mancanti e adeguando automaticamente i gradi di libertà.

exam_scores <- c(78, 85, NA, 92, 68, 75, NA, 88, 91, NA)
n_valid <- sum(!is.na(exam_scores))
cat('Valid observations:', n_valid, '
')
cat('Mean:   ', round(mean(exam_scores, na.rm = TRUE), 2), '
')
cat('SD:     ', round(sd(exam_scores, na.rm = TRUE), 2), '
')
cat('Var:    ', round(var(exam_scores, na.rm = TRUE), 2), '
')

median() e quantile() con na.rm

median() e quantile() sono spesso più robuste rispetto ai valori anomali della media, ma richiedono anch'esse na.rm = TRUE per gestire correttamente i valori mancanti.

incomes <- c(45000, NA, 52000, 48000, NA, 210000, 51000, NA, 49000)
cat('Observations:', sum(!is.na(incomes)), '
')
cat('Median income:', median(incomes, na.rm = TRUE), '
')
cat('Mean income:  ', mean(incomes, na.rm = TRUE), '
')  # pulled up by 210000
cat('25th pctile:  ', quantile(incomes, 0.25, na.rm = TRUE), '
')
cat('75th pctile:  ', quantile(incomes, 0.75, na.rm = TRUE), '
')

prod() e cumsum() con na.rm

prod(x, na.rm = TRUE) calcola il prodotto dei valori non-NA. Le funzioni cumulative come cumsum() NON dispongono di na.rm: gli NA vengono propagati a partire dal primo valore mancante.

growth_rates <- c(1.05, NA, 1.03, 1.08, NA, 1.02)
cat('Product of rates:', prod(growth_rates, na.rm = TRUE), '
')

# cumsum propagates NAs
values <- c(10, 20, NA, 40, 50)
cat('cumsum (with NA):', cumsum(values), '
')

# Workaround: replace NA first
filled <- replace(values, is.na(values), 0)
cat('cumsum (NA=0):   ', cumsum(filled), '
')

na.rm nelle funzioni apply

Quando utilizza apply() sulle righe o sulle colonne di una matrice, può passare na.rm = TRUE alla funzione tramite .... In questo modo gli aggregati vengono calcolati ignorando gli NA.

m <- matrix(c(88,NA,72, 95,81,NA, 67,75,90), nrow = 3)
cat('Matrix:
'); print(m)

# Row means ignoring NAs
cat('Row means (na.rm=TRUE):', apply(m, 1, mean, na.rm = TRUE), '
')

# Col means ignoring NAs
cat('Col means (na.rm=TRUE):', apply(m, 2, mean, na.rm = TRUE), '
')

rowSums() / colSums() con na.rm

rowSums() e colSums() hanno un proprio parametro na.rm, che non viene passato tramite .... L'uso di na.rm = TRUE fa sì che trattino gli NA come 0 nelle somme.

sales <- matrix(c(100,NA,80, NA,90,70, 110,85,NA), nrow = 3)
cat('Sales matrix:
'); print(sales)

cat('Row sums (na.rm=F):', rowSums(sales), '
')             # NAs propagate
cat('Row sums (na.rm=T):', rowSums(sales, na.rm = TRUE), '
')
cat('Col means (na.rm=T):', colMeans(sales, na.rm = TRUE), '
')

Confronto: na.rm=FALSE rispetto a TRUE

Capire quando utilizzare na.rm = TRUE invece di FALSE dipende dall'obiettivo dell'analisi: FALSE garantisce che Lei sappia che i dati sono incompleti; TRUE calcola statistiche della migliore stima possibile usando i dati disponibili.

# Always check: how much data is missing BEFORE using na.rm=TRUE
collected <- c(78, NA, 85, NA, 91, 74, NA, 88, 82, NA)
pct_missing <- mean(is.na(collected)) * 100
cat('Missing:', round(pct_missing, 1), '% of data
')

if (pct_missing < 20) {
  cat('Acceptable: computing mean with na.rm=TRUE
')
  cat('Mean:', round(mean(collected, na.rm = TRUE), 2), '
')
} else {
  cat('Too much missing data — investigate before computing
')
}

na.rm nelle funzioni definite dall'utente

Quando scrive funzioni di aggregazione personalizzate, includa un parametro na.rm e lo passi alle funzioni base di R. In questo modo le Sue funzioni saranno coerenti con le convenzioni di R.

# Custom function with na.rm support
cv <- function(x, na.rm = FALSE) {
  # Coefficient of Variation = SD / mean
  s <- sd(x, na.rm = na.rm)
  m <- mean(x, na.rm = na.rm)
  return(s / m)
}

readings <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)
cat('CV (na.rm=FALSE):', cv(readings), '
')          # NA
cat('CV (na.rm=TRUE): ', round(cv(readings, na.rm = TRUE), 4), '
')

Verifica rapida

Che cosa restituisce mean(c(10, 20, NA, 40), na.rm = TRUE)?

Riepilogo: NA nei calcoli

Ottimo! Concetti chiave di questa lezione:

  • La maggior parte delle funzioni di aggregazione (mean, sum, min, max, sd ecc.) dispone di un parametro na.rm
  • na.rm = FALSE (impostazione predefinita) significa che NA si propaga: se un valore è NA, il risultato è NA
  • na.rm = TRUE ignora gli NA e calcola la statistica solo sui valori presenti
  • Il denominatore di mean(na.rm=TRUE) è il numero di valori non NA, non la lunghezza totale
  • Controlli sempre la proporzione di dati mancanti prima di calcolare statistiche con na.rm=TRUE
  • Includa na.rm nelle Sue funzioni di aggregazione per seguire la convenzione di R
# Complete summary with na.rm
data_vec <- c(55, NA, 72, 88, NA, 61, 79, NA, 93, 68)
cat('N valid:', sum(!is.na(data_vec)), '
')
cat('Mean:  ', round(mean(data_vec, na.rm=TRUE), 2), '
')
cat('Median:', median(data_vec, na.rm=TRUE), '
')
cat('SD:    ', round(sd(data_vec, na.rm=TRUE), 2), '
')
cat('Min:   ', min(data_vec, na.rm=TRUE), '
')
cat('Max:   ', max(data_vec, na.rm=TRUE), '
')

Domande Frequenti

La lezione «NA nei calcoli e nelle aggregazioni» è gratuita?

Sì — il testo completo di «NA nei calcoli e nelle aggregazioni» è 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 «NA nei calcoli e nelle aggregazioni»?

Controlli il comportamento di NA in mean(), sum() e nelle altre funzioni aggregate. 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 4 di 4.

Quanto tempo richiede la lezione «NA nei calcoli e nelle aggregazioni»?

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