R Academy · Oppitunti

keep(), discard() ja listojen suodatus

Suodattakaa listan alkioita predikaattifunktioilla selkeitä työnkulkuja varten.

Oppitunti 4/413 vaihetta

keep(), discard() ja listojen suodatus on ilmainen R Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu R Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. R Academy-kurssilla on yhteensä 4 oppituntia.

Listojen suodattaminen purrr:lla

purrr tarjoaa funktiojoukon listojen suodattamiseen, etsimiseen ja testaamiseen predikaattien perusteella. Predikaatti on funktio, joka palauttaa arvon TRUE tai FALSE. Nämä funktiot korvaavat pitkät Filter()-kutsut ja ehtosilmukat.

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() — Predikaatin täyttävien alkioiden säilyttäminen

keep(.x, .p) säilyttää vain .x-alkiot, joille predikaatti .p palauttaa arvon TRUE. Se on discard()-funktion vastakohta. Predikaattina voi olla funktion nimi, kaava tai looginen vektori.

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() — Predikaatin täyttävien alkioiden poistaminen

discard(.x, .p) poistaa alkiot, joille predikaatti palauttaa arvon TRUE, ja säilyttää loput. Se on keep()-funktion käänteinen toiminto. Käyttäkää sitä NULL-arvojen, NA-arvojen tai ei-toivottujen tyyppien suodattamiseen listasta.

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-alkioiden poistaminen

compact(.x) poistaa listasta kaikki NULL-alkiot. Se vastaa toimintoa discard(.x, is.null), mutta on tiiviimpi. Se on erityisen hyödyllinen map()-kutsujen jälkeen, jos jotkin syötteet voivat palauttaa arvon NULL.

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() — Ensimmäisen osuman etsiminen

detect(.x, .p) palauttaa ensimmäisen alkion, joka täyttää predikaatin ehdon. Jos mikään alkio ei täytä ehtoa, funktio palauttaa arvon NULL. Käyttäkää detect(.right=TRUE)-muotoa, kun haluatte etsiä oikealta ja löytää viimeisen osuman.

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() — Ensimmäisen osuman sijainnin etsiminen

detect_index(.x, .p) palauttaa predikaatin ehdon täyttävän ensimmäisen alkion indeksin (tai arvon 0L, jos osumaa ei löydy). Tämä on hyödyllistä, kun tarvitsette sijainnin arvon sijaan — esimerkiksi alkion päivittämistä tai poimimista varten.

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() — Täyttävätkö kaikki alkiot ehdon?

every(.x, .p) palauttaa arvon TRUE, jos predikaatti täyttyy jokaisen alkion kohdalla. Suoritus keskeytyy ensimmäiseen FALSE-arvoon. Tämä vastaa lauseketta all(map_lgl(.x, .p)), mutta arviointi tehdään laiskasti.

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() — Täyttääkö jokin alkio ehdon?

some(.x, .p) palauttaa arvon TRUE, jos vähintään yksi alkio täyttää predikaatin ehdon. Suoritus keskeytyy ensimmäiseen TRUE-arvoon. Tämä vastaa lauseketta any(map_lgl(.x, .p)), mutta arviointi tehdään laiskasti.

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() — Eikö mikään alkio täytä ehtoa?

none(.x, .p) palauttaa arvon TRUE, jos mikään alkio ei täytä predikaatin ehtoa. Se vastaa lauseketta !some(.x, .p), mutta on selkeämpi validointikonteksteissa, joissa haluatte varmistaa ehdon puuttumisen.

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()-funktion yhdistäminen map()-funktioon

keep()-funktion (tai discard()-funktion) ketjuttaminen map()-funktion kanssa on yleinen toimintamalli: suodattakaa ensin listasta asiaankuuluvat alkiot ja tehkää niille sitten muunnos. Näin suodatuslogiikka ja käsittelylogiikka pysyvät selkeästi erillään.

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()-funktion käyttäminen is.*-funktioiden kanssa

R:n valmiit is.*-predikaattifunktiot (is.numeric, is.character, is.null, is.na, is.finite) toimivat suoraan predikaatteina keep()- ja discard()-funktioissa ilman, että niitä tarvitsee kääriä ~-merkillä.

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

Pikatarkistus

Mitä detect(.x, .p) palauttaa, kun mikään kohteen .x alkio ei täytä predikaattia .p?

Kertaus: listojen suodatusfunktiot

Keskeiset opit purrr-paketin listojen suodatustyökaluista:

  • keep(.x, .p) — säilyttää alkiot, joiden kohdalla predikaatti on TRUE
  • discard(.x, .p) — poistaa alkiot, joiden kohdalla predikaatti on TRUE
  • compact(.x) — poistaa kaikki NULL-alkiot
  • detect(.x, .p) — palauttaa ensimmäisen predikaattia vastaavan alkion (tai NULL)
  • detect_index(.x, .p) — palauttaa ensimmäisen osuman indeksin (tai 0L)
  • every(.x, .p) — palauttaa TRUE, jos kaikki alkiot vastaavat predikaattia
  • some(.x, .p) — palauttaa TRUE, jos jokin alkio vastaa predikaattia
  • none(.x, .p) — palauttaa TRUE, jos mikään alkio ei vastaa predikaattia
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))
Aloita maksutta

Opi R tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
43
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”keep(), discard() ja listojen suodatus” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa R Academy-oppimispolun 3 oppituntia, myös oppitunnin “keep(), discard() ja listojen suodatus”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. R Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”keep(), discard() ja listojen suodatus”?

Suodattakaa listan alkioita predikaattifunktioilla selkeitä työnkulkuja varten. Harjoittelet R Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni R Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin R Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”keep(), discard() ja listojen suodatus”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä R Academy-oppitunnilla?

Kyllä. Jokainen R Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. map() ja tyypitetyt muunnelmat
  2. map2() ja pmap() useille syötteille
  3. reduce(), accumulate() ja walk()
  4. keep(), discard() ja listojen suodatus
← Takaisin: R Academy