0Pricing
R Academy · Lekcja

NA w obliczeniach i agregacjach

Kontroluj zachowanie NA w mean(), sum() i innych funkcjach agregujących.

NA w obliczeniach i agregacjach to bezpłatna lekcja R Academy na CoddyKit. To lekcja 4 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.

Parametr na.rm

Większość funkcji agregujących w języku R przyjmuje argument na.rm (usuwanie NA). Po ustawieniu wartości TRUE funkcja pomija wartości NA przed obliczeniem wyniku. Domyślnie na.rm = FALSE, dlatego wartości NA są propagowane.

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() z na.rm

mean(x, na.rm = TRUE) oblicza średnią arytmetyczną niebrakujących wartości. Mianownikiem jest liczba obecnych wartości, a nie całkowita długość wektora.

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() z na.rm

sum(x, na.rm = TRUE) sumuje wyłącznie wartości inne niż NA. Jest to niezbędne podczas zliczania wartości TRUE w wektorze logicznym, który może zawierać NA, lub obliczania sum na podstawie niekompletnych danych.

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() i max() z na.rm

Funkcje min() i max() również mają parametr na.rm. Bez niego pojedyncza wartość NA na wejściu powoduje, że funkcja zwraca NA. Przy ustawieniu na.rm = TRUE zwracane są wartości skrajne spośród obecnych wartości.

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() i sd() z na.rm

Wariancja (var()) i odchylenie standardowe (sd()) również obsługują parametr na.rm. Statystyki są obliczane wyłącznie na podstawie niebrakujących obserwacji, z automatycznym uwzględnieniem stopni swobody.

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() i quantile() z na.rm

median() i quantile() są często bardziej odporne na wartości odstające niż średnia, ale również wymagają na.rm = TRUE, aby prawidłowo obsługiwać brakujące wartości.

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() i cumsum() z na.rm

prod(x, na.rm = TRUE) oblicza iloczyn wartości innych niż NA. Funkcje skumulowane, takie jak cumsum(), NIE mają parametru na.rm — wartości NA są propagowane od pierwszej brakującej wartości.

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 w funkcjach apply

Podczas używania apply() dla wierszy lub kolumn macierzy można przekazać do funkcji na.rm = TRUE za pomocą .... Dzięki temu agregaty są obliczane z pominięciem 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() z na.rm

Funkcje rowSums() i colSums() mają własny parametr na.rm (nie jest on przekazywany za pomocą ...). Użycie na.rm = TRUE powoduje, że podczas sumowania traktują NA jak 0.

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), '
')

Porównanie: na.rm=FALSE a TRUE

Zrozumienie, kiedy użyć na.rm = TRUE, a kiedy FALSE, zależy od celu analizy: FALSE pozwala upewnić się, że dane są niekompletne, natomiast TRUE oblicza statystyki będące najlepszym przybliżeniem na podstawie dostępnych danych.

# 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 we własnych funkcjach

Podczas pisania własnych funkcji agregujących należy uwzględnić parametr na.rm i przekazywać go do podstawowych funkcji R. Dzięki temu funkcje będą zgodne z konwencjami 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), '
')

Szybkie sprawdzenie

Co zwraca mean(c(10, 20, NA, 40), na.rm = TRUE)?

Podsumowanie: NA w obliczeniach

Świetnie! Najważniejsze wnioski z tej lekcji:

  • Większość funkcji agregujących (mean, sum, min, max, sd itd.) ma parametr na.rm
  • na.rm = FALSE (wartość domyślna) oznacza propagowanie NA — jeśli dowolna wartość to NA, wynikiem jest NA
  • na.rm = TRUE pomija wartości NA i oblicza statystykę wyłącznie na podstawie obecnych wartości
  • Mianownikiem w funkcji mean(na.rm=TRUE) jest liczba wartości innych niż NA, a nie całkowita długość
  • Przed obliczaniem statystyk z użyciem na.rm=TRUE należy zawsze sprawdzić udział brakujących danych
  • We własnych funkcjach agregujących należy uwzględnić na.rm, aby zachować konwencję 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), '
')

Często zadawane pytania

Czy lekcja „NA w obliczeniach i agregacjach” jest bezpłatna?

Tak — pełny tekst „NA w obliczeniach i agregacjach” 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 „NA w obliczeniach i agregacjach”?

Kontroluj zachowanie NA w mean(), sum() i innych funkcjach agregujących. Ć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 4 z 4.

Ile czasu zajmuje lekcja „NA w obliczeniach i agregacjach”?

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