Usuwanie i zastępowanie wartości NA
Stosuj na.omit(), complete.cases() i strategie ręcznego zastępowania.
Usuwanie i zastępowanie wartości NA to bezpłatna lekcja R Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Strategie postępowania z NA
Istnieją trzy główne strategie postępowania z brakującymi wartościami: usunięcie ich, zastąpienie stałą wartością lub uzupełnienie za pomocą oszacowania statystycznego. Właściwe podejście zależy od danych i celów analizy.
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, '
')Usuwanie wartości NA za pomocą x[!is.na(x)]
Najbardziej bezpośrednim sposobem usunięcia wartości NA z wektora jest filtrowanie logiczne: x[!is.na(x)]. Zachowuje ono tylko elementy, dla których is.na(x) ma wartość FALSE (czyli wartości obecne).
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() dla wektorów
na.omit(x) usuwa wartości NA z wektora. Jest równoważne z x[!is.na(x)], ale dodatkowo zapisuje pozycje usuniętych wartości NA w atrybucie o nazwie '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() dla ramek danych
Zastosowanie na.omit(df) do ramki danych usuwa każdy wiersz zawierający co najmniej jedną wartość NA. Nazywa się to usuwaniem kompletnych obserwacji (listwise deletion) — cała obserwacja zostaje usunięta.
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() — kompletność wierszy
complete.cases(df) zwraca wektor logiczny zawierający TRUE dla wierszy, które nie mają brakujących wartości. Można go użyć do filtrowania kompletnych wierszy lub identyfikowania wierszy niekompletnych.
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), '
')Zastępowanie NA stałą wartością
Aby zastąpić NA konkretną wartością, należy użyć przypisania logicznego: x[is.na(x)] <- value. Typowe zamienniki to 0 dla liczności, średnia lub mediana dla danych ciągłych albo etykieta kategorii dla faktorów.
# 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() — zastępowanie funkcyjne
replace(x, list, values) zwraca zmodyfikowaną kopię x, w której elementy o pozycjach list zostają zastąpione wartościami values. Jest to funkcyjne podejście do zastępowania, które nie modyfikuje oryginału.
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 modifiedUzupełnianie w przód (ostatnia obserwacja przeniesiona dalej)
Popularną strategią uzupełniania jest uzupełnianie w przód (LOCF): zastępowanie każdego NA ostatnią znaną wartością. Stosuje się je w przypadku danych szeregów czasowych, gdy pomiary zachowują swoją wartość do momentu aktualizacji.
# 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, '
')Zastępowanie NA w wektorach znakowych
Te same techniki działają w przypadku wektorów znakowych. Zastępowanie NA w ciągach znaków etykietą taką jak 'Unknown' lub 'Missing' jest często stosowane w analizie danych kategorialnych.
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 zastępowania warunkowego
Czasami potrzebne są różne wartości zastępcze zależnie od wartości w innej kolumnie. Należy użyć indeksowania z warunkami, aby zastosować ukierunkowane zastępowanie.
# 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, '
')Podsumowanie metod usuwania NA
Podsumowanie narzędzi do obsługi NA w języku R:
x[!is.na(x)]— usuwa NA z wektorana.omit(x)— usuwa NA (zapisuje również ich pozycje)na.omit(df)— usuwa niekompletne wiersze z ramki danychcomplete.cases(df)— wektor logiczny: TRUE dla kompletnych wierszyx[is.na(x)] <- val— zastępuje NA w miejscureplace(x, is.na(x), val)— zastępowanie funkcyjne (zwraca kopię)
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)), '
')Szybkie sprawdzenie
Jaki wynik zwraca wyrażenie na.omit(c(1, NA, 3, NA, 5))?
Podsumowanie: usuwanie i zastępowanie wartości NA
Świetna praca! Najważniejsze informacje z tej lekcji:
x[!is.na(x)]ina.omit(x)usuwają NA z wektorana.omit(df)wykonuje usuwanie kompletnych obserwacji (usuwa każdy wiersz zawierający NA)complete.cases(df)identyfikuje wiersze bez brakujących wartościx[is.na(x)] <- valuezastępuje NA w miejscureplace(x, is.na(x), value)zwraca zmodyfikowaną kopię bez zmiany oryginału- Strategię należy wybrać na podstawie przyczyny braków danych i ich liczby
# 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), '
')Ucz się R dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 43
- Lekcje
- 159
Często zadawane pytania
Czy lekcja „Usuwanie i zastępowanie wartości NA” jest bezpłatna?
Tak — pełny tekst „Usuwanie i zastępowanie wartości NA” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Usuwanie i zastępowanie wartości NA”?
Stosuj na.omit(), complete.cases() i strategie ręcznego zastępowania. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Usuwanie i zastępowanie wartości NA”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Zrozumienie NA w R
- Wykrywanie i zliczanie brakujących wartości
- Usuwanie i zastępowanie wartości NA
- NA w obliczeniach i agregacjach