R Academy · Lektion

NA-Werte entfernen und ersetzen

Wenden Sie na.omit(), complete.cases() und manuelle Ersetzungsstrategien an.

Lektion 3 von 413 Schritte

NA-Werte entfernen und ersetzen ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Strategien zum Umgang mit NA

Für den Umgang mit fehlenden Werten gibt es drei wesentliche Strategien: Sie können sie entfernen, durch eine Konstante ersetzen oder mithilfe einer statistischen Schätzung imputieren. Welche Vorgehensweise geeignet ist, hängt von Ihren Daten und den Zielen Ihrer Analyse ab.

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

NAs mit x[!is.na(x)] entfernen

Die direkteste Möglichkeit, NAs aus einem Vektor zu entfernen, ist logisches Subsetting: x[!is.na(x)]. Dadurch bleiben nur die Elemente erhalten, für die is.na(x) FALSE ist (also vorhandene Werte).

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() für Vektoren

na.omit(x) entfernt NA-Werte aus einem Vektor. Die Funktion entspricht x[!is.na(x)], speichert aber zusätzlich die Positionen der entfernten NAs in einem Attribut namens '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() für Data Frames

Wird na.omit(df) auf einen Data Frame angewendet, entfernt die Funktion jede Zeile, die mindestens ein NA enthält. Dies wird als listenweiser Ausschluss bezeichnet – die gesamte Beobachtung wird entfernt.

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() – Vollständigkeit pro Zeile

complete.cases(df) gibt einen logischen Vektor zurück, der für Zeilen ohne fehlende Werte TRUE enthält. Verwenden Sie ihn, um vollständige Zeilen zu filtern oder unvollständige Zeilen zu ermitteln.

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

NA durch eine Konstante ersetzen

Um NA durch einen bestimmten Wert zu ersetzen, verwenden Sie eine logische Zuweisung: x[is.na(x)] <- value. Häufige Ersetzungen sind 0 für Zählwerte, der Mittelwert oder Median für kontinuierliche Daten oder eine Kategorienbezeichnung für Faktoren.

# 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() – Funktionales Ersetzen

replace(x, list, values) gibt eine modifizierte Kopie von x zurück, in der die Elemente an den Positionen aus list durch values ersetzt wurden. Dies ist der funktionale Ansatz zum Ersetzen, bei dem das ursprüngliche Objekt nicht verändert wird.

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

Vorwärtsauffüllen (Last Observation Carried Forward)

Eine verbreitete Imputationsstrategie ist das Vorwärtsauffüllen (LOCF): Jedes NA wird durch den zuletzt bekannten Wert ersetzt. Dies wird bei Zeitreihendaten verwendet, wenn Messwerte bis zu ihrer Aktualisierung fortgeschrieben werden.

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

NA in Zeichenkettenvektoren ersetzen

Dieselben Techniken funktionieren auch für Zeichenkettenvektoren. In der kategorialen Datenanalyse ist es üblich, NA in Zeichenketten durch eine Bezeichnung wie 'Unknown' oder 'Missing' zu ersetzen.

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

Strategie zum bedingten Ersetzen

Manchmal sollen abhängig vom Wert einer anderen Spalte unterschiedliche Ersatzwerte verwendet werden. Verwenden Sie eine indizierte Auswahl mit Bedingungen, um gezielte Ersetzungen vorzunehmen.

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

Zusammenfassung der Methoden zum Entfernen von NA

Zusammenfassung der Werkzeuge zum Umgang mit NA in R:

  • x[!is.na(x)] – NAs aus einem Vektor entfernen
  • na.omit(x) – NAs entfernen (und zusätzlich ihre Positionen speichern)
  • na.omit(df) – unvollständige Zeilen aus einem Data Frame entfernen
  • complete.cases(df) – logischer Vektor: TRUE für vollständige Zeilen
  • x[is.na(x)] <- val – NAs direkt ersetzen
  • replace(x, is.na(x), val) – funktionales Ersetzen (gibt eine Kopie zurück)
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)), '
')

Kurze Wissensprüfung

Welchen Wert gibt na.omit(c(1, NA, 3, NA, 5)) zurück?

Zusammenfassung: NAs entfernen und ersetzen

Sehr gut! Die wichtigsten Erkenntnisse aus dieser Lektion:

  • x[!is.na(x)] und na.omit(x) entfernen NAs aus einem Vektor
  • na.omit(df) führt einen listenweisen Ausschluss durch (entfernt jede Zeile mit einem NA)
  • complete.cases(df) ermittelt Zeilen ohne fehlende Werte
  • x[is.na(x)] <- value ersetzt NAs direkt
  • replace(x, is.na(x), value) gibt eine modifizierte Kopie zurück, ohne das Original zu verändern
  • Wählen Sie Ihre Strategie danach aus, warum Daten fehlen und wie viele Werte fehlen
# 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), '
')
Kostenlos starten

Lerne R mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
43
Lektionen
159

Häufig gestellte Fragen

Ist die Lektion „NA-Werte entfernen und ersetzen“ kostenlos?

Ja — der vollständige Text von „NA-Werte entfernen und ersetzen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „NA-Werte entfernen und ersetzen“?

Wenden Sie na.omit(), complete.cases() und manuelle Ersetzungsstrategien an. Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um R Academy zu starten?

Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „NA-Werte entfernen und ersetzen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?

Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. NA in R verstehen
  2. Fehlende Werte erkennen und zählen
  3. NA-Werte entfernen und ersetzen
  4. NA in Berechnungen und Aggregationen
← Zurück zu R Academy