Rimozione e sostituzione dei valori NA
Applichi na.omit(), complete.cases() e strategie di sostituzione manuale.
Rimozione e sostituzione dei valori NA è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Strategie per gestire gli NA
Esistono tre strategie principali per gestire i valori mancanti: rimuoverli, sostituirli con una costante oppure imputarli utilizzando una stima statistica. L'approccio corretto dipende dai dati e dagli obiettivi dell'analisi.
data_vals <- c(88, NA, 72, NA, 91, 65, NA, 78)
cat('Original data:', data_vals, '
')
cat('NA count:', sum(is.na(data_vals)), '
')
# Strategy 1: remove
cat('After removal:', data_vals[!is.na(data_vals)], '
')
# Strategy 2: replace with 0
replaced <- data_vals; replaced[is.na(replaced)] <- 0
cat('Replaced with 0:', replaced, '
')Rimuovere gli NA con x[!is.na(x)]
Il modo più diretto per rimuovere gli NA da un vettore è il subset logico: x[!is.na(x)]. In questo modo vengono mantenuti solo gli elementi per cui is.na(x) è FALSE, cioè i valori presenti.
response_times <- c(1.2, NA, 0.9, 1.5, NA, 1.1, 0.8, NA, 1.3)
cat('With NAs: ', response_times, '
')
cat('Length:', length(response_times), '
')
clean_times <- response_times[!is.na(response_times)]
cat('Without NAs: ', clean_times, '
')
cat('Length:', length(clean_times), '
')
cat('Mean after removal:', round(mean(clean_times), 3), '
')na.omit() per i vettori
na.omit(x) rimuove i valori NA da un vettore. È equivalente a x[!is.na(x)], ma memorizza anche le posizioni degli NA rimossi in un attributo chiamato 'na.action'.
scores <- c(88, NA, 72, NA, 91, 65, NA, 78)
clean_scores <- na.omit(scores)
cat('Original:', scores, '
')
cat('Cleaned: ', as.numeric(clean_scores), '
')
# na.omit records which positions were removed
removed_at <- attr(clean_scores, 'na.action')
cat('NAs were at positions:', removed_at, '
')na.omit() per i data frame
Quando viene applicato a un data frame, na.omit(df) rimuove ogni riga che contiene almeno un NA. Questa operazione è chiamata eliminazione listwise: l'intera osservazione viene rimossa.
df <- data.frame(
name = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
age = c(28, NA, 32, 45, 29),
salary = c(55000, 72000, NA, 90000, 61000)
)
cat('Original rows:', nrow(df), '
')
df_clean <- na.omit(df)
cat('After na.omit rows:', nrow(df_clean), '
')
print(df_clean)complete.cases() — completezza per riga
complete.cases(df) restituisce un vettore logico con TRUE per le righe che non contengono valori mancanti. Può essere utilizzato per filtrare le righe complete o per individuare quelle incomplete.
df <- data.frame(
id = 1:5,
x = c(1, NA, 3, 4, NA),
y = c(NA, 2, 3, NA, 5)
)
cc <- complete.cases(df)
cat('Complete cases (T/F):', cc, '
')
cat('Complete rows:
')
print(df[cc, ])
cat('Number complete:', sum(cc), '
')Sostituire NA con una costante
Per sostituire NA con un valore specifico, utilizzi l'assegnazione logica: x[is.na(x)] <- value. Le sostituzioni comuni includono 0 per i conteggi, la media o la mediana per i dati continui oppure un'etichetta di categoria per i fattori.
# Replace with 0
counts <- c(5, NA, 3, NA, 8, 1, NA, 4)
counts_filled <- counts
counts_filled[is.na(counts_filled)] <- 0
cat('Original:', counts, '
')
cat('Filled: ', counts_filled, '
')
# Replace with mean of present values
mean_val <- mean(counts, na.rm = TRUE)
counts_mean <- counts
counts_mean[is.na(counts_mean)] <- mean_val
cat('Mean-filled:', round(counts_mean, 1), '
')replace() — sostituzione funzionale
replace(x, list, values) restituisce una copia modificata di x, in cui gli elementi alle posizioni list vengono sostituiti con values. È l'approccio funzionale, che non modifica direttamente l'oggetto, alla sostituzione.
temps <- c(22.1, NA, 19.8, NA, 25.1)
cat('Original:', temps, '
')
# Replace NAs with the median
median_temp <- median(temps, na.rm = TRUE)
filled_temps <- replace(temps, is.na(temps), median_temp)
cat('Filled: ', filled_temps, '
')
cat('Original unchanged:', temps, '
') # original not modifiedRiempimento in avanti (Last Observation Carried Forward)
Una strategia comune di imputazione è il riempimento in avanti (LOCF): ogni NA viene sostituito con l'ultimo valore noto. Viene utilizzata per i dati di serie temporali, quando le misurazioni restano valide fino al loro aggiornamento.
# Manual forward-fill
readings <- c(10, NA, NA, 13, NA, 15, NA, NA, 18)
filled <- readings
for (i in seq_along(filled)) {
if (is.na(filled[i]) && i > 1) {
filled[i] <- filled[i - 1]
}
}
cat('Original: ', readings, '
')
cat('Forward-filled:', filled, '
')Sostituire NA nei vettori di caratteri
Le stesse tecniche funzionano con i vettori di caratteri. Nelle analisi di dati categorici è comune sostituire gli NA nelle stringhe con un'etichetta come 'Unknown' o 'Missing'.
categories <- c('A', NA, 'B', 'A', NA, 'C', NA, 'B')
cat('Original:', categories, '
')
# Replace with 'Unknown'
filled_cat <- replace(categories, is.na(categories), 'Unknown')
cat('Filled: ', filled_cat, '
')
# Count each category
cat('Table:
')
print(table(filled_cat))Strategia di sostituzione condizionale
A volte è necessario utilizzare valori di sostituzione diversi in base al valore di un'altra colonna. Utilizzi l'indicizzazione con condizioni per applicare sostituzioni mirate.
# Scores: replace NA with group mean
group <- c('A', 'A', 'B', 'B', 'A', 'B')
scores <- c(85, NA, 72, NA, 90, 78)
mean_a <- mean(scores[group == 'A'], na.rm = TRUE)
mean_b <- mean(scores[group == 'B'], na.rm = TRUE)
imputed <- scores
imputed[is.na(imputed) & group == 'A'] <- mean_a
imputed[is.na(imputed) & group == 'B'] <- mean_b
cat('Original:', scores, '
')
cat('Imputed: ', imputed, '
')Riepilogo dei metodi di rimozione degli NA
Riepilogo degli strumenti per gestire gli NA in R:
x[!is.na(x)]— rimuove gli NA da un vettorena.omit(x)— rimuove gli NA e ne registra anche le posizionina.omit(df)— rimuove le righe incomplete da un data framecomplete.cases(df)— vettore logico: TRUE per le righe completex[is.na(x)] <- val— sostituisce gli NA direttamentereplace(x, is.na(x), val)— sostituzione funzionale (restituisce una copia)
v <- c(5, NA, 8, NA, 3, 7)
cat('Remove: ', v[!is.na(v)], '
')
cat('Replace with 0: ', replace(v, is.na(v), 0), '
')
cat('Replace with mean:', replace(v, is.na(v), mean(v, na.rm=TRUE)), '
')Verifica rapida
Che cosa restituisce na.omit(c(1, NA, 3, NA, 5))?
Riepilogo: rimuovere e sostituire gli NA
Ottimo lavoro! Ecco i concetti principali di questa lezione:
x[!is.na(x)]ena.omit(x)rimuovono gli NA da un vettorena.omit(df)esegue l'eliminazione listwise, rimuovendo ogni riga con un NAcomplete.cases(df)individua le righe senza valori mancantix[is.na(x)] <- valuesostituisce gli NA direttamentereplace(x, is.na(x), value)restituisce una copia modificata senza cambiare l'originale- Scelga la strategia in base al motivo per cui mancano i dati e alla quantità di dati mancanti
# Complete workflow: audit, then handle
data_raw <- c(82, NA, 75, NA, 91, 68, NA, 79)
cat('Missing:', sum(is.na(data_raw)), '/', length(data_raw), '
')
# Replace with median (robust to outliers)
imputed <- replace(data_raw, is.na(data_raw), median(data_raw, na.rm=TRUE))
cat('Before imputation mean:', round(mean(data_raw, na.rm=TRUE), 2), '
')
cat('After imputation mean: ', round(mean(imputed), 2), '
')Domande Frequenti
La lezione «Rimozione e sostituzione dei valori NA» è gratuita?
Sì — il testo completo di «Rimozione e sostituzione dei valori NA» è 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 «Rimozione e sostituzione dei valori NA»?
Applichi na.omit(), complete.cases() e strategie di sostituzione manuale. 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 3 di 4.
Quanto tempo richiede la lezione «Rimozione e sostituzione dei valori NA»?
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
- Comprendere NA in R
- Rilevamento e conteggio dei valori mancanti
- Rimozione e sostituzione dei valori NA
- NA nei calcoli e nelle aggregazioni