Inizia subitoInizia gratis

Trasformare variabili continue in categoriche (1)

Una generalizzazione dell’idea precedente è usare più soglie; cioè, suddividere una variabile continua in "bucket" (o "bin"), proprio come fa un istogramma. In R base useresti cut() per questo compito. Per esempio, in uno studio sulle abitudini al fumo, potresti prendere il numero tipico di sigarette fumate al giorno e trasformarlo in un fattore.

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

L’equivalente in sparklyr è usare ft_bucketizer(). Il codice ha un formato simile a ft_binarizer(), ma questa volta devi passare un vettore di punti di taglio all’argomento splits. Ecco lo stesso esempio riscritto in stile sparklyr.

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

Ci sono diversi aspetti importanti da notare. Avrai notato che l’argomento breaks di cut() corrisponde a splits di ft_bucketizer(). C’è una piccola differenza in come vengono gestiti i valori sul bordo. In cut(), per impostazione predefinita, il bordo superiore (a destra) è incluso in ciascun bucket, ma non quello sinistro. ft_bucketizer() include il bordo inferiore (a sinistra) in ciascun bucket, ma non quello destro. Questo significa che è equivalente a chiamare cut() con l’argomento right = FALSE.

Un’eccezione è che ft_bucketizer() include i valori su entrambi i bordi per il bucket più alto. Quindi ft_bucketizer() è anche equivalente a impostare include.lowest = TRUE quando usi cut().

L’ultima cosa da notare è che mentre cut() restituisce un fattore, ft_bucketizer() restituisce un vettore numeric, con i valori nel primo bucket come zero, nel secondo come uno, nel terzo come due, e così via. Se vuoi lavorare sui risultati in R, devi convertire esplicitamente in un fattore. Questo è un pattern di codice comune:

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

Questo esercizio fa parte del corso

Introduzione a Spark con sparklyr in R

Visualizza corso

Istruzioni dell'esercizio

È già stata creata una connessione Spark chiamata spark_conn. Una tibble collegata ai metadati delle tracce memorizzati in Spark è stata predefinita come track_metadata_tbl. decades è una sequenza numerica 1920, 1930, …, 2020 e decade_labels è una descrizione testuale di quei decenni.

  • Crea una variabile chiamata hotttnesss_over_time a partire da track_metadata_tbl.
    • Seleziona i campi artist_hotttnesss e year.
    • Converte la colonna year in numeric.
    • Usa ft_bucketizer() per creare un nuovo campo, decade, che suddivide gli anni usando decades.
    • Raccogli il risultato.
    • Converte il campo decade in un fattore con etichette decade_labels.
  • Disegna un grafico a barre con ggplot() di artist_hotttnesss per decade.
    • Il primo argomento di ggplot() è l’argomento dei dati, hotttnesss_over_time.
    • Il secondo argomento di ggplot() è l’estetica, che prende decade e artist_hotttnesss racchiusi in aes().
    • Aggiungi geom_boxplot() per disegnare le barre.

esercizio interattivo pratico

Prova questo esercizio completando questo codice di esempio.

# 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(___, ___)) +
  ___()  
Modifica ed esegui il codice