R Academy · Lektion

keep(), discard() und Listenfilterung

Filtern Sie Listenelemente anhand von Prädikatfunktionen für übersichtliche Pipelines.

Lektion 4 von 413 Schritte

keep(), discard() und Listenfilterung ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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.

Listen mit purrr filtern

purrr stellt eine Gruppe von Funktionen zum Filtern, Suchen und Testen von Listen anhand von Prädikaten bereit. Ein Prädikat ist eine Funktion, die TRUE oder FALSE zurückgibt. Diese Funktionen ersetzen ausführliche Filter()-Aufrufe und bedingte Schleifen.

library(purrr)

# A mixed list to filter
mixed <- list(1L, 'hello', 3.14, NULL, TRUE, 42L, 'world', NULL)

cat('Total elements:', length(mixed), '\n')
cat('Non-NULL elements:', length(compact(mixed)))

keep() — Elemente behalten, die ein Prädikat erfüllen

keep(.x, .p) behält nur die Elemente von .x, für die das Prädikat .p den Wert TRUE zurückgibt. Die Funktion ist das Gegenstück zu discard(). Das Prädikat kann ein Funktionsname, eine Formel oder ein logischer Vektor sein.

library(purrr)

mixed <- list(1L, 'hello', 3.14, TRUE, 42L, 'world', 2.7)

# Keep only numeric values
numeric_only <- keep(mixed, is.numeric)
print(numeric_only)

# Keep values greater than 5
keep(mixed, ~is.numeric(.x) && .x > 5)

discard() — Elemente entfernen, die ein Prädikat erfüllen

discard(.x, .p) entfernt die Elemente, für die das Prädikat TRUE zurückgibt, und behält den Rest. Die Funktion ist das Gegenstück zu keep(). Verwenden Sie sie, um NULL-Werte, NAs oder unerwünschte Typen aus einer Liste herauszufiltern.

library(purrr)

results <- list(
  model_a = list(rmse=2.5, converged=TRUE),
  model_b = list(rmse=NA, converged=FALSE),
  model_c = list(rmse=1.8, converged=TRUE),
  model_d = list(rmse=NA, converged=FALSE)
)

# Discard models that did not converge
converged_models <- discard(results, ~!.x$converged)
map_dbl(converged_models, ~.x$rmse)

compact() — NULL-Elemente entfernen

compact(.x) entfernt alle NULL-Elemente aus einer Liste — das entspricht discard(.x, is.null), ist aber kürzer. Das ist besonders nützlich nach map()-Aufrufen, die für einige Eingaben möglicherweise NULL zurückgeben.

library(purrr)

# Simulate fetching data that might return NULL
ids <- 1:6
fetch_data <- function(id) {
  if (id %% 2 == 0) NULL else list(id=id, value=id*10)
}

raw_results <- map(ids, fetch_data)
cat('With NULLs:', length(raw_results), '\n')

clean_results <- compact(raw_results)
cat('Without NULLs:', length(clean_results))

detect() — Erste Übereinstimmung finden

detect(.x, .p) gibt das erste Element zurück, das das Prädikat erfüllt. Wenn kein Element passt, gibt die Funktion NULL zurück. Verwenden Sie detect(.right=TRUE), um von rechts zu suchen und die letzte Übereinstimmung zu finden.

library(purrr)

prices <- list(15.99, 8.50, 23.99, 5.25, 19.99, 4.75)

# Find first price under $10
first_cheap <- detect(prices, ~.x < 10)
cat('First price under $10:', first_cheap, '\n')

# Find last price under $10
last_cheap <- detect(prices, ~.x < 10, .right=TRUE)
cat('Last price under $10:', last_cheap)

detect_index() — Position der ersten Übereinstimmung finden

detect_index(.x, .p) gibt den Index des ersten Elements zurück, das das Prädikat erfüllt (oder 0L, wenn keines gefunden wird). Das ist nützlich, wenn Sie die Position statt des Werts benötigen, beispielsweise um dieses Element zu aktualisieren oder zu extrahieren.

library(purrr)

models <- list(
  list(name='lm', rmse=3.5),
  list(name='rf', rmse=2.1),
  list(name='xgb', rmse=1.8),
  list(name='svm', rmse=2.4)
)

# Find the index of the best model (lowest RMSE)
best_idx <- detect_index(models, function(m) m$rmse < 2.0)
cat('Best model index:', best_idx, '\n')
cat('Best model name:', models[[best_idx]]$name)

every() — Erfüllen alle Elemente das Prädikat?

every(.x, .p) gibt TRUE zurück, wenn das Prädikat für jedes Element erfüllt ist. Die Prüfung wird beim ersten FALSE abgebrochen. Das entspricht all(map_lgl(.x, .p)), wird aber verzögert ausgewertet.

library(purrr)

batch_results <- list(
  list(status='success', rows=150),
  list(status='success', rows=200),
  list(status='success', rows=175)
)

failed_batch <- list(
  list(status='success', rows=150),
  list(status='error', rows=0),
  list(status='success', rows=175)
)

cat('All success (good):', every(batch_results, ~.x$status == 'success'), '\n')
cat('All success (bad):', every(failed_batch, ~.x$status == 'success'))

some() — Erfüllt mindestens ein Element das Prädikat?

some(.x, .p) gibt TRUE zurück, wenn mindestens ein Element das Prädikat erfüllt. Die Prüfung wird beim ersten TRUE abgebrochen. Das entspricht any(map_lgl(.x, .p)), wird aber verzögert ausgewertet.

library(purrr)

datasets <- list(
  data.frame(x=1:3, y=c(1,NA,3)),
  data.frame(x=4:6, y=7:9),
  data.frame(x=7:9, y=c(NA,NA,NA))
)

# Does any dataset contain NAs?
cat('Any NAs:', some(datasets, anyNA), '\n')

# Is every dataset NA-free?
cat('All clean:', every(datasets, ~!anyNA(.x)))

none() — Erfüllt kein Element das Prädikat?

none(.x, .p) gibt TRUE zurück, wenn kein Element das Prädikat erfüllt. Das entspricht !some(.x, .p), ist aber in Validierungskontexten, in denen das Fehlen einer Bedingung bestätigt werden soll, besser lesbar.

library(purrr)

api_responses <- list(
  list(code=200, data='OK'),
  list(code=200, data='OK'),
  list(code=201, data='Created')
)

# Ensure no errors occurred
no_errors <- none(api_responses, ~.x$code >= 400)
cat('No errors:', no_errors, '\n')

# Check another batch
bad_batch <- c(api_responses, list(list(code=500, data='Error')))
none(bad_batch, ~.x$code >= 400)

keep() mit map() kombinieren

Das Verketten von keep() (oder discard()) mit map() ist ein häufig verwendetes Muster: Filtern Sie zunächst die Liste auf relevante Elemente und wenden Sie anschließend eine Transformation an. Dadurch werden Filterlogik und Verarbeitungslogik sauber voneinander getrennt.

library(purrr)

model_results <- list(
  list(name='A', converged=TRUE, rmse=2.5),
  list(name='B', converged=FALSE, rmse=NA),
  list(name='C', converged=TRUE, rmse=1.8),
  list(name='D', converged=TRUE, rmse=3.1)
)

# Keep converged, extract RMSE
model_results %>%
  keep(~.x$converged) %>%
  map_dbl(~.x$rmse)

keep() mit is.*-Funktionen verwenden

Die integrierten Prädikatsfunktionen is.* von R (is.numeric, is.character, is.null, is.na, is.finite) können direkt als Prädikate in keep() und discard() verwendet werden, ohne dass sie mit ~ umschlossen werden müssen.

library(purrr)

mixed_env <- list(
  count = 42L,
  name = 'Alice',
  ratio = 3.14,
  flag = TRUE,
  missing = NULL,
  data = data.frame(x=1:3)
)

# Extract different types
numeric_items <- keep(mixed_env, is.numeric)
cat('Numeric items:', length(numeric_items), '\n')

# Remove NULL items
cleaned <- discard(mixed_env, is.null)
cat('After removing NULL:', length(cleaned))

Kurztest

Was gibt detect(.x, .p) zurück, wenn kein Element in .x das Prädikat .p erfüllt?

Zusammenfassung: Funktionen zum Filtern von Listen

Die wichtigsten Erkenntnisse zu purrrs Werkzeugen zum Filtern von Listen:

  • keep(.x, .p) — behält Elemente, für die das Prädikat TRUE ergibt
  • discard(.x, .p) — entfernt Elemente, für die das Prädikat TRUE ergibt
  • compact(.x) — entfernt alle NULL-Elemente
  • detect(.x, .p) — gibt das erste Element zurück, das dem Prädikat entspricht (oder NULL)
  • detect_index(.x, .p) — gibt den Index des ersten passenden Elements zurück (oder 0L)
  • every(.x, .p) — TRUE, wenn alle Elemente übereinstimmen
  • some(.x, .p) — TRUE, wenn mindestens ein Element übereinstimmt
  • none(.x, .p) — TRUE, wenn kein Element übereinstimmt
library(purrr)

scores <- list(45, 72, 88, 53, 91, 67, 39, 85)

passing <- keep(scores, ~.x >= 60)
failing <- discard(scores, ~.x >= 60)

cat('Passing:', length(passing), 'students\n')
cat('Failing:', length(failing), 'students\n')
cat('All pass:', every(scores, ~.x >= 60), '\n')
cat('Any fail:', some(scores, ~.x < 60), '\n')
cat('First pass score:', detect(scores, ~.x >= 60))
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 „keep(), discard() und Listenfilterung“ kostenlos?

Ja — der vollständige Text von „keep(), discard() und Listenfilterung“ 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 „keep(), discard() und Listenfilterung“?

Filtern Sie Listenelemente anhand von Prädikatfunktionen für übersichtliche Pipelines. 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 4 von 4.

Wie lange dauert die Lektion „keep(), discard() und Listenfilterung“?

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. map() und typisierte Varianten
  2. map2() und pmap() für mehrere Eingaben
  3. reduce(), accumulate() und walk()
  4. keep(), discard() und Listenfilterung
← Zurück zu R Academy