Aan de slagBegin gratis

Continue variabelen omzetten naar categorisch (1)

Een generalisatie van het vorige idee is om meerdere drempels te hebben; je splitst een continue variabele in "buckets" (of "bins"), net zoals een histogram doet. In base-R zou je hiervoor cut() gebruiken. In een onderzoek naar rookgewoonten kun je bijvoorbeeld het gemiddelde aantal sigaretten per dag nemen en dat omzetten naar een factor.

smoking_status <- cut(
  cigarettes_per_day,
  breaks = c(0, 1, 10, 20, Inf),
  labels = c("non", "light", "moderate", "heavy"),
  right  = FALSE
)

Het sparklyr-equivalent hiervan is ft_bucketizer() gebruiken. De code lijkt op ft_binarizer(), maar deze keer geef je een vector met snijpunten door aan het splits-argument. Hieronder staat hetzelfde voorbeeld herschreven in sparklyr-stijl.

smoking_data %>%
  ft_bucketizer("cigarettes_per_day", "smoking_status", splits = c(0, 1, 10, 20, Inf))

Er zijn een paar belangrijke dingen om op te merken. Je hebt misschien gezien dat het breaks-argument van cut() hetzelfde is als het splits-argument van ft_bucketizer(). Er is een klein verschil in hoe waarden op de grenzen worden behandeld. In cut() valt standaard de bovenste (rechter) grens in elke bucket, maar de linker niet. ft_bucketizer() neemt de onderste (linker) grens op in elke bucket, maar de rechter niet. Dit komt overeen met cut() aanroepen met het argument right = FALSE.

Eén uitzondering is dat ft_bucketizer() waarden op beide grenzen opneemt voor de bovenste bucket. ft_bucketizer() komt dus ook overeen met include.lowest = TRUE instellen bij cut().

Tot slot: waar cut() een factor teruggeeft, retourneert ft_bucketizer() een numeric vector, waarbij waarden in de eerste bucket als nul worden gegeven, in de tweede als één, in de derde als twee, enzovoort. Als je in R met de resultaten wilt werken, moet je expliciet omzetten naar een factor. Dit is een veelvoorkomend codepatroon:

a_tibble %>%
  ft_bucketizer("x", "x_buckets", splits = splits) %>%
  collect() %>%
  mutate(x_buckets = factor(x_buckets, labels = labels))

Deze oefening maakt deel uit van de cursus

Introductie tot Spark met sparklyr in R

Bekijk cursus

Oefeninstructies

Er is al een Spark-verbinding voor je gemaakt als spark_conn. Een tibble die is gekoppeld aan de trackmetadata die in Spark is opgeslagen is vooraf gedefinieerd als track_metadata_tbl. decades is een numerieke reeks van 1920, 1930, …, 2020, en decade_labels is een tekstuele beschrijving van die decennia.

  • Maak een variabele hotttnesss_over_time op basis van track_metadata_tbl.
    • Selecteer de velden artist_hotttnesss en year.
    • Zet de kolom year om naar numeric.
    • Gebruik ft_bucketizer() om een nieuw veld decade te maken, waarin de jaren worden gesplitst met decades.
    • Verzamel het resultaat met collect().
    • Zet het veld decade om naar een factor met labels decade_labels.
  • Maak een ggplot()-boxplot van artist_hotttnesss per decade.
    • Het eerste argument van ggplot() is het data-argument, hotttnesss_over_time.
    • Het tweede argument van ggplot() is de esthetiek, die decade en artist_hotttnesss bevat, verpakt in aes().
    • Voeg geom_boxplot() toe om de boxplots te tekenen.

Interactieve oefening met praktijkervaring

Probeer deze oefening door deze voorbeeldcode aan te vullen.

# track_metadata_tbl, decades, decade_labels have been pre-defined
track_metadata_tbl
decades
decade_labels

hotttnesss_over_time <- track_metadata_tbl %>%
  # Select artist_hotttnesss and year
  ___ %>%
  # Convert year to numeric
  ___ %>%
  # Bucketize year to decade using decades vector
  ___ %>%
  # Collect the result
  ___ %>%
  # Convert decade to factor using decade_labels
  ___

# Draw a boxplot of artist_hotttnesss by decade
ggplot(___, aes(___, ___)) +
  ___()  
Code bewerken en uitvoeren