1. Learn
  2. /
  3. คอร์ส
  4. /
  5. R 中使用 sparklyr 的 Spark 入门

Connected

แบบฝึกหัด

将连续变量转换为分类型(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))

คำแนะนำ

100 XP

已经为您创建了名为 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() 来绘制箱线图。