開始使用免費開始

將連續變數轉換為類別變數(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() 會在最上層的那個桶同時包含兩側邊界的值。因此,使用 ft_bucketizer() 也等同於在 cut() 中設定 include.lowest = TRUE

最後一點要注意的是,cut() 會回傳因子,而 ft_bucketizer() 會回傳 numeric 向量:第一個桶的值是 0,第二個桶是 1,第三個桶是 2,依此類推。如果你想在 R 裡處理結果,需要明確轉成因子。這是很常見的程式碼模式:

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

本練習屬於課程

使用 R 的 sparklyr:Spark 入門

檢視課程

練習說明

我們已經幫你建立好 Spark 連線 spark_conn。連到 Spark 中曲目中繼資料的 tibble 物件已預先定義為 track_metadata_tbldecades 是 1920、1930、…、2020 的數列,而 decade_labels 是對這些年代的文字描述。

  • track_metadata_tbl 建立名為 hotttnesss_over_time 的變數。
    • 選擇 artist_hotttnesssyear 欄位。
    • year 欄位轉成 numeric
    • 使用 ft_bucketizer() 建立新欄位 decade,並以 decades 作為年份的切點。
    • 收集結果。
    • decade 欄位轉成帶有標籤 decade_labels 的因子。
  • 繪製依 decade 比較 artist_hotttnesssggplot() 圖。
    • ggplot() 的第一個引數是資料 hotttnesss_over_time
    • ggplot() 的第二個引數是對映美學,使用把 decadeartist_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(___, ___)) +
  ___()  
編輯並執行程式碼