R Academy · Lekcja

Usuwanie i zastępowanie wartości NA

Stosuj na.omit(), complete.cases() i strategie ręcznego zastępowania.

Lekcja 3 z 413 kroki

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 modified

Uzupeł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 wektora
  • na.omit(x) — usuwa NA (zapisuje również ich pozycje)
  • na.omit(df) — usuwa niekompletne wiersze z ramki danych
  • complete.cases(df) — wektor logiczny: TRUE dla kompletnych wierszy
  • x[is.na(x)] <- val — zastępuje NA w miejscu
  • replace(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)] i na.omit(x) usuwają NA z wektora
  • na.omit(df) wykonuje usuwanie kompletnych obserwacji (usuwa każdy wiersz zawierający NA)
  • complete.cases(df) identyfikuje wiersze bez brakujących wartości
  • x[is.na(x)] <- value zastępuje NA w miejscu
  • replace(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), '
')
Bezpłatny start

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

  1. Zrozumienie NA w R
  2. Wykrywanie i zliczanie brakujących wartości
  3. Usuwanie i zastępowanie wartości NA
  4. NA w obliczeniach i agregacjach
← Powrót do R Academy