Bắt đầu ngayBắt đầu miễn phí

Chuyển đổi biến liên tục thành biến phân loại (1)

Khái quát hóa của ý tưởng trước đó là có nhiều ngưỡng: tức là bạn chia một biến liên tục thành các "bucket" (hoặc "bin"), giống như cách biểu đồ histogram làm. Trong base R, bạn sẽ dùng cut() cho tác vụ này. Ví dụ, trong một nghiên cứu về thói quen hút thuốc, bạn có thể lấy số điếu thuốc hút mỗi ngày, rồi chuyển nó thành một factor.

smoking_status <- cut(
  cigarettes_per_day,
  breaks = c(0, 1, 10, 20, Inf),
  labels = c("non", "light", "moderate", "heavy"),
  right  = FALSE
)

Tương đương trong sparklyr là dùng ft_bucketizer(). Cú pháp khá giống ft_binarizer(), nhưng lần này bạn phải truyền một vector các điểm cắt vào tham số splits. Dưới đây là cùng ví dụ viết lại theo phong cách sparklyr.

smoking_data %>%
  ft_bucketizer("cigarettes_per_day", "smoking_status", splits = c(0, 1, 10, 20, Inf))

Có vài điểm quan trọng cần lưu ý. Bạn có thể nhận ra tham số breaks của cut() giống với tham số splits của ft_bucketizer(). Có một khác biệt nhỏ về cách xử lý các giá trị ở ranh giới. Trong cut(), theo mặc định, ranh giới trên (bên phải) được bao gồm trong mỗi bucket, còn ranh giới dưới thì không. ft_bucketizer() bao gồm ranh giới dưới (bên trái) trong mỗi bucket, nhưng không bao gồm ranh giới phải. Điều này tương đương với việc gọi cut() với đối số right = FALSE.

Một ngoại lệ là ft_bucketizer() bao gồm cả hai ranh giới cho bucket cao nhất. Vì vậy, ft_bucketizer() cũng tương đương với việc đặt include.lowest = TRUE khi dùng cut().

Điểm cuối cùng cần lưu ý là trong khi cut() trả về một factor, thì ft_bucketizer() trả về một vector numeric, với các giá trị trong bucket thứ nhất là 0, bucket thứ hai là 1, bucket thứ ba là 2, v.v. Nếu bạn muốn xử lý kết quả trong R, bạn cần chuyển đổi rõ ràng sang factor. Đây là một mẫu mã thường gặp:

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

Bài tập này là một phần của khóa học

Nhập môn Spark với sparklyr trong R

Xem khóa học

Hướng dẫn bài tập

Kết nối Spark đã được tạo sẵn dưới tên spark_conn. Một tibble gắn với metadata bài hát được lưu trong Spark đã được định nghĩa trước là track_metadata_tbl. decades là dãy số 1920, 1930, …, 2020, và decade_labels là mô tả văn bản cho các thập kỷ đó.

  • Tạo biến tên hotttnesss_over_time từ track_metadata_tbl.
    • Chọn các trường artist_hotttnesssyear.
    • Chuyển cột year sang kiểu numeric.
    • Dùng ft_bucketizer() để tạo trường mới decade, chia năm theo decades.
    • Thu thập kết quả bằng collect().
    • Chuyển trường decade thành factor với nhãn decade_labels.
  • Vẽ biểu đồ cột ggplot() của artist_hotttnesss theo decade.
    • Đối số đầu tiên của ggplot() là dữ liệu hotttnesss_over_time.
    • Đối số thứ hai của ggplot() là aesthetic, lấy decadeartist_hotttnesss trong aes().
    • Thêm geom_boxplot() để vẽ các hộp (boxplot).

Bài tập tương tác thực hành trực tiếp

Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.

# 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(___, ___)) +
  ___()  
Chỉnh sửa và Chạy Mã