將連續變數轉換為類別變數(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_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(___, ___)) +
___()