R Academy · Lektion

NA i beräkningar och aggregationer

Styr NA-beteendet i mean(), sum() och andra aggregationsfunktioner.

Lektion 4 av 413 steg

NA i beräkningar och aggregationer är en gratis lektion i R Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för R Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i R Academy innehåller totalt 4 lektioner.

Parametern na.rm

De flesta aggregeringsfunktioner i R accepterar argumentet na.rm (ta bort NA). När det sätts till TRUE ignorerar funktionen NA-värden innan resultatet beräknas. Som standard är na.rm = FALSE, vilket innebär att NA-värden sprids vidare.

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

mean(x, na.rm = TRUE) beräknar det aritmetiska medelvärdet av de värden som inte saknas. Nämnaren är antalet befintliga värden, inte den totala längden.

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

sum(x, na.rm = TRUE) adderar endast värden som inte är NA. Detta är viktigt när du räknar TRUE-värden i en logisk vektor som kan innehålla NA, eller beräknar summor från ofullständiga data.

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() och max() med na.rm

min() och max() har också parametern na.rm. Utan den gör ett enda NA-värde i indata att funktionen returnerar NA. Med na.rm = TRUE returneras extremvärdena bland de befintliga värdena.

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() och sd() med na.rm

Varians (var()) och standardavvikelse (sd()) stöder också na.rm. De beräknar statistiken med endast de observationer som inte saknas och justerar automatiskt frihetsgraderna.

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() och quantile() med na.rm

median() och quantile() är ofta mer robusta mot avvikande värden än medelvärdet, men behöver också na.rm = TRUE för att hantera saknade värden korrekt.

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() och cumsum() med na.rm

prod(x, na.rm = TRUE) beräknar produkten av värden som inte är NA. Kumulativa funktioner som cumsum() har INTE na.rm – NA-värden sprids från det första saknade värdet och framåt.

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 i apply-funktioner

När du använder apply() över rader eller kolumner i en matris kan du skicka na.rm = TRUE till funktionen via .... Då beräknas aggregatvärden samtidigt som NA-värden ignoreras.

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

rowSums() och colSums() har sin egen parameter na.rm (den skickas inte via ...). Med na.rm = TRUE behandlas NA som 0 i summor.

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

Jämförelse: na.rm=FALSE jämfört med TRUE

Att förstå när na.rm = TRUE ska användas i stället för FALSE handlar om syftet med analysen: FALSE säkerställer att Ni märker när data är ofullständiga, medan TRUE beräknar bästa möjliga statistik utifrån tillgängliga data.

# 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 i användardefinierade funktioner

När Ni skriver egna aggregeringsfunktioner bör Ni inkludera en parameter för na.rm och skicka den vidare till R:s basfunktioner. Då följer funktionerna R:s konventioner.

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

Snabb kontroll

Vad returnerar mean(c(10, 20, NA, 40), na.rm = TRUE)?

Sammanfattning: NA i beräkningar

Utmärkt! Här är lektionens viktigaste punkter:

  • De flesta aggregeringsfunktioner (mean, sum, min, max, sd med flera) har en parameter för na.rm
  • na.rm = FALSE (standardvärdet) innebär att NA sprids vidare — om något värde är NA blir resultatet NA
  • na.rm = TRUE ignorerar NA-värden och beräknar statistiken enbart utifrån de värden som finns
  • Nämnaren för mean(na.rm=TRUE) är antalet värden som inte är NA, inte den totala längden
  • Kontrollera alltid andelen saknade data innan Ni beräknar statistik med na.rm=TRUE
  • Inkludera na.rm i Era egna aggregeringsfunktioner för att följa R:s konvention
# 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), '
')
Gratis att börja

Lär dig R med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
43
Lektioner
159

Vanliga frågor

Är lektionen ”NA i beräkningar och aggregationer” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen R Academy, inklusive ”NA i beräkningar och aggregationer”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i R Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”NA i beräkningar och aggregationer”?

Styr NA-beteendet i mean(), sum() och andra aggregationsfunktioner. Ni övar på R Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig R Academy?

Du behöver inga förkunskaper. Utbildningen i R Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”NA i beräkningar och aggregationer”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här R Academy-lektionen?

Ja. Varje R Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Förstå NA i R
  2. Upptäcka och räkna saknade värden
  3. Ta bort och ersätta NA-värden
  4. NA i beräkningar och aggregationer
← Tillbaka till R Academy