将连续变量转换为分类型(1)
对前一思路的一般化是使用多个阈值;也就是说,像直方图一样,将一个连续变量切分为若干"桶"(或"箱")。在 base R 中,您可以使用 cut() 完成此任务。例如,在一项关于吸烟习惯的研究中,您可以取每天通常吸烟的支数,并将其转换为一个因子。
smoking_status <- cut(
cigarettes_per_day,
breaks = c(0, 1, 10, 20, Inf),
labels = c("non", "light", "moderate", "heavy"),
right = FALSE
)
在 sparklyr 中的等价做法是使用 ft_bucketizer()。其代码形式与 ft_binarizer() 类似,但这一次您需要在 splits 参数中传入一个切分点向量。下面是用 sparklyr 风格改写的同一示例。
smoking_data %>%
ft_bucketizer("cigarettes_per_day", "smoking_status", splits = c(0, 1, 10, 20, Inf))
需要注意几件重要的事。您也许已经发现,cut() 的 breaks 参数与 ft_bucketizer() 的 splits 参数含义相同。两者在边界值的处理上略有不同:在 cut() 中,默认每个区间包含右边界而不包含左边界;而 ft_bucketizer() 包含左(下)边界而不包含右边界。这等价于在调用 cut() 时设置 right = FALSE。
一个例外是,对最上面的区间,ft_bucketizer() 会同时包含两个边界的值。因此,在使用 cut() 时将 include.lowest = TRUE,也与 ft_bucketizer() 等价。
最后要注意的是,cut() 返回的是因子,而 ft_bucketizer() 返回的是 numeric 向量:第 1 个区间的值为 0,第 2 个区间为 1,第 3 个区间为 2,依此类推。如果您希望在 R 中对结果继续处理,需要显式转换为因子。这是一种常见的代码模式:
a_tibble %>%
ft_bucketizer("x", "x_buckets", splits = splits) %>%
collect() %>%
mutate(x_buckets = factor(x_buckets, labels = labels))
本练习是课程的一部分
R 中使用 sparklyr 的 Spark 入门
练习说明
已经为您创建了名为 spark_conn 的 Spark 连接。一个附加到存储于 Spark 的曲目信息的 tibble 已预定义为 track_metadata_tbl。decades 是从 1920、1930、…、到 2020 的数值序列,decade_labels 是这些年代的文本描述。
- 从
track_metadata_tbl创建名为hotttnesss_over_time的变量。- 选择
artist_hotttnesss和year字段。 - 将
year列转换为numeric。 - 使用
ft_bucketizer()创建新字段decade,并用decades对年份进行切分。 - 收集结果。
- 将
decade字段转换为因子,并使用标签decade_labels。
- 选择
- 绘制按
decade展示artist_hotttnesss的ggplot()柱状图。ggplot()的第一个参数是数据参数hotttnesss_over_time。ggplot()的第二个参数是映射美学,需要将decade和artist_hotttnesss放入aes()中。- 添加
geom_boxplot()来绘制箱线图。
交互式实操练习
通过完成这段示例代码来试试这个练习。
# 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(___, ___)) +
___()