R Academy · Lekcja

Zrozumienie NA w R

Dowiedz się, co oznacza NA, dlaczego jest propagowane i czym różni się od NULL.

Lekcja 1 z 413 kroki

Zrozumienie NA w R to bezpłatna lekcja R Academy na CoddyKit. To lekcja 1 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.

Czym jest NA w języku R?

NA oznacza Not Available — reprezentuje brakującą lub nieznaną wartość. W przeciwieństwie do NULL (brak obiektu) lub NaN (nie jest liczbą), NA jest symbolem zastępczym danych, które istnieją, ale są nieznane.

# 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 a NULL

NA to brakująca wartość wewnątrz wektora — miejsce istnieje, ale nie ma znanej wartości. NULL oznacza całkowity brak obiektu — ma długość 0 i nie można przechowywać go wewnątrz wektora.

# 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 a NaN

NaN (Not a Number) jest wynikiem matematycznie niezdefiniowanych operacji, takich jak 0/0 lub sqrt(-1). Jest specjalną wartością numeryczną, podczas gdy NA to ogólny znacznik brakującej wartości, który może dotyczyć dowolnego typu.

# 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 a Inf

Inf i -Inf oznaczają odpowiednio dodatnią i ujemną nieskończoność — powstają w wyniku operacji takich jak 1/0. W przeciwieństwie do NA, Inf jest znaną (choć skrajną) wartością liczbową i standardowo uczestniczy w porównaniach.

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

Propagacja NA w działaniach arytmetycznych

NA jest zaraźliwe w działaniach arytmetycznych: każda operacja obejmująca NA zwraca NA. Jest to zamierzone — jeśli jedna wartość w obliczeniu jest nieznana, wynik również jest nieznany.

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) — typowane wartości NA

Domyślna wartość NA ma typ logical. R udostępnia typowane warianty NA dla każdego typu atomowego. Są one ważne podczas pracy z wektorami o określonym typie, ponieważ pozwalają uniknąć niezamierzonej konwersji typów.

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_ w praktyce

Podczas tworzenia wektora typu integer zawierającego brakującą wartość należy użyć NA_integer_, aby zachować właściwy typ wektora. Użycie zwykłego NA w niektórych kontekstach powoduje niejawną konwersję do typu 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_ i NA_character_

NA_real_ służy do oznaczania brakujących wartości w wektorach typu double (numeric), a NA_character_ — brakujących ciągów znaków. Są one szczególnie ważne podczas tworzenia wektorów wewnątrz funkcji, gdzie istotna jest spójność typów.

# 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 w operacjach logicznych

W operacjach logicznych NA podlega logice trójwartościowej: TRUE | NA daje TRUE (ponieważ TRUE OR dowolna wartość daje TRUE), natomiast FALSE | NA daje NA (bez znajomości wartości NA nie możemy określić wyniku).

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 w wektorach i ramkach danych

Brakujące wartości często występują w rzeczywistych danych. Zrozumienie zachowania NA pomaga poprawnie interpretować podsumowania, wykrywać problemy z jakością danych i wybierać właściwą strategię postępowania.

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

Typy NA: pełny obraz

Poniżej znajduje się podsumowanie specjalnych wartości związanych z NA w języku R:

  • NA — ogólna brakująca wartość (typ logiczny)
  • NA_integer_, NA_real_, NA_complex_, NA_character_ — typowane wartości NA
  • NaN — niezdefiniowana liczba (wynik 0/0, sqrt(-1))
  • Inf, -Inf — wartości nieskończone (wynik 1/0)
  • NULL — brak obiektu (długość 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

Szybkie sprawdzenie

Jaki wynik w języku R daje wyrażenie NA == NA?

Podsumowanie: zrozumienie NA

Doskonale! Najważniejsze informacje z tej lekcji:

  • NA = brakująca wartość (wiadomo, że istnieje, ale jej wartość jest nieznana)
  • NULL = brak obiektu (jest usuwany z wektorów)
  • NaN = niezdefiniowany wynik arytmetyczny (jest również wartością NA)
  • Inf / -Inf = wartości nieskończone (NIE są wartościami NA)
  • NA jest zaraźliwe w działaniach arytmetycznych — operacje na NA zwracają NA
  • Należy używać typowanych wartości NA (NA_integer_ itd.), aby zapewnić bezpieczeństwo typów
  • NA należy zawsze sprawdzać za pomocą is.na(), nigdy za pomocą == 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)]), '
')
}
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 „Zrozumienie NA w R” jest bezpłatna?

Tak — pełny tekst „Zrozumienie NA w R” 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 „Zrozumienie NA w R”?

Dowiedz się, co oznacza NA, dlaczego jest propagowane i czym różni się od NULL. Ć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 1 z 4.

Ile czasu zajmuje lekcja „Zrozumienie NA w R”?

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