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
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_timetừtrack_metadata_tbl.- Chọn các trường
artist_hotttnesssvàyear. - Chuyển cột
yearsang kiểunumeric. - Dùng
ft_bucketizer()để tạo trường mớidecade, chia năm theodecades. - Thu thập kết quả bằng
collect(). - Chuyển trường
decadethành factor với nhãndecade_labels.
- Chọn các trường
- Vẽ biểu đồ cột
ggplot()củaartist_hotttnessstheodecade.- Đối số đầu tiên của
ggplot()là dữ liệuhotttnesss_over_time. - Đối số thứ hai của
ggplot()là aesthetic, lấydecadevàartist_hotttnessstrongaes(). - Thêm
geom_boxplot()để vẽ các hộp (boxplot).
- Đối số đầu tiên của
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(___, ___)) +
___()