Listenelemente nach Bedingung entfernen

Author

Claudia Spannbauer

Anwendungsfall:

  • Es sollen Elemente, die eine bestimmte Bedingung erfüllen, aus einer Liste entfernt werden.

  • Z. B. Werte, die undefiniert oder negativ sind oder unterhalb eines bestimmten Schwellenwertes liegen.

lst <- list(NA, 0, NA, 1, 2)

Lösung:

  • Anwenden der discard() Funktion aus dem purrr Paket.

  • Werte, die dem Kriterium entsprechen, werden entfernt.

library(purrr)

lst |>
  discard(is.na)
[[1]]
[1] 0

[[2]]
[1] 1

[[3]]
[1] 2

Entfernen von character strings:

lst <- list(3, "dog", 2, "cat", 1)
lst |>
  discard(is.character)
[[1]]
[1] 3

[[2]]
[1] 2

[[3]]
[1] 1

Eine eigene Bedingung definieren:

is_na_or_null <- function(x) {
  is.na(x) || is.null(x)
}

lst <- list(1, NA, 2, NULL, 3)
lst |>
  discard(is_na_or_null)
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

Komplexe Objekte

  • Listen können komplexe Objekte enthalten, zum Beispiel lineare Modelle, die mit der lm() Funktion erstellt worden sind:
mods <- list(lm(x ~ y1),
             lm(x ~ y2),
             lm(x ~ y3))
  • Mit einer Bedingung können Modelle identifiziert werden, deren \(R^2\) kleiner a.s 0.7 sind, danach können diese Modelle mit der discard() Funktion entfernt werden:
filter_r2 <- function(model) {
  summary(model)$r.squared < 0.7
}

mods |>
  discard(filter_r2)

💫 Die Gegenfunktion von discard() ist keep().

💫 In keep() werden Elemente angegeben, die in der Liste bleiben sollen.