Transformar variables continuas en categóricas (1)
Una generalización de la idea anterior es usar múltiples umbrales; es decir, dividir una variable continua en "buckets" (o "bins"), como hace un histograma. En R base, usarías cut() para esta tarea. Por ejemplo, en un estudio sobre hábitos de consumo de tabaco, podrías tomar el número típico de cigarrillos fumados al día y transformarlo en un factor.
smoking_status <- cut(
cigarettes_per_day,
breaks = c(0, 1, 10, 20, Inf),
labels = c("non", "light", "moderate", "heavy"),
right = FALSE
)
El equivalente en sparklyr es usar ft_bucketizer(). El código tiene un formato similar a ft_binarizer(), pero esta vez debes pasar un vector de puntos de corte en el argumento splits. Aquí tienes el mismo ejemplo reescrito al estilo sparklyr.
smoking_data %>%
ft_bucketizer("cigarettes_per_day", "smoking_status", splits = c(0, 1, 10, 20, Inf))
Hay varios aspectos importantes a tener en cuenta. Habrás notado que el argumento breaks de cut() es el mismo que el argumento splits de ft_bucketizer(). Existe una pequeña diferencia en cómo se tratan los valores en el límite. En cut(), de forma predeterminada, el límite superior (derecho) está incluido en cada intervalo, pero no el izquierdo. ft_bucketizer() incluye el límite inferior (izquierdo) en cada intervalo, pero no el derecho. Esto significa que es equivalente a llamar a cut() con el argumento right = FALSE.
Hay una excepción: ft_bucketizer() incluye los valores en ambos límites para el intervalo más alto. Así que ft_bucketizer() también es equivalente a establecer include.lowest = TRUE al usar cut().
Por último, ten en cuenta que, mientras cut() devuelve un factor, ft_bucketizer() devuelve un vector numeric, con los valores del primer intervalo como cero, los del segundo como uno, los del tercero como dos, y así sucesivamente. Si quieres trabajar con los resultados en R, necesitas convertir explícitamente a factor. Este es un patrón de código común:
a_tibble %>%
ft_bucketizer("x", "x_buckets", splits = splits) %>%
collect() %>%
mutate(x_buckets = factor(x_buckets, labels = labels))
Este ejercicio forma parte del curso
Introducción a Spark con sparklyr en R
Instrucciones del ejercicio
Se ha creado una conexión de Spark llamada spark_conn. Se ha predefinido un tibble asociado a los metadatos de pistas almacenados en Spark como track_metadata_tbl. decades es una secuencia numérica de 1920, 1930, …, 2020, y decade_labels es una descripción textual de esas décadas.
- Crea una variable llamada
hotttnesss_over_timea partir detrack_metadata_tbl.- Selecciona los campos
artist_hotttnesssyyear. - Convierte la columna
yearanumeric. - Usa
ft_bucketizer()para crear un nuevo campo,decade, que divida los años usandodecades. - Recopila el resultado.
- Convierte el campo
decadea factor con las etiquetasdecade_labels.
- Selecciona los campos
- Dibuja un gráfico de barras de
ggplot()deartist_hotttnessspordecade.- El primer argumento de
ggplot()es el argumento de datos,hotttnesss_over_time. - El segundo argumento de
ggplot()es la estética, que tomadecadeyartist_hotttnesssenvueltos enaes(). - Añade
geom_boxplot()para dibujar las barras.
- El primer argumento de
Ejercicio interactivo práctico
Prueba este ejercicio y completa el código de muestra.
# 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(___, ___)) +
___()