การแปลงตัวแปรต่อเนื่องให้เป็นตัวแปรเชิงกลุ่ม (1)
แนวคิดที่ต่อยอดจากเรื่องก่อนหน้าคือการกำหนดจุดตัดหลายจุด นั่นคือการแบ่งตัวแปรต่อเนื่องออกเป็น "ถัง" (bucket) หรือ "ช่อง" (bin) เหมือนที่ histogram ทำ ใน base-R จะใช้ cut() สำหรับงานนี้ ตัวอย่างเช่น ในการศึกษาพฤติกรรมการสูบบุหรี่ คุณสามารถนำจำนวนบุหรี่ที่สูบต่อวันมาแปลงเป็น factor ได้
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() แต่คราวนี้ต้องส่ง vector ของจุดตัดไปยัง argument splits นี่คือตัวอย่างเดิมที่เขียนใหม่ในสไตล์ sparklyr
smoking_data %>%
ft_bucketizer("cigarettes_per_day", "smoking_status", splits = c(0, 1, 10, 20, Inf))
มีข้อควรสังเกตหลายประการ คุณอาจสังเกตได้ว่า argument breaks ของ cut() นั้นเทียบได้กับ argument splits ของ ft_bucketizer() แต่มีความแตกต่างเล็กน้อยในการจัดการค่าที่อยู่บนขอบเขต ใน cut() โดยค่าเริ่มต้น ขอบเขตบน (ด้านขวา) จะถูกรวมอยู่ในแต่ละถัง แต่ไม่รวมขอบเขตซ้าย ส่วน ft_bucketizer() จะรวมขอบเขตล่าง (ด้านซ้าย) ไว้ในแต่ละถัง แต่ไม่รวมด้านขวา ซึ่งเทียบได้กับการเรียก cut() ด้วย argument right = FALSE
ข้อยกเว้นคือ ft_bucketizer() จะรวมค่าที่ขอบเขตทั้งสองด้านสำหรับถังบนสุด ดังนั้น ft_bucketizer() จึงเทียบเท่ากับการตั้งค่า include.lowest = TRUE ใน cut() ด้วย
สิ่งสุดท้ายที่ควรทราบคือ ในขณะที่ cut() คืนค่าเป็น factor แต่ ft_bucketizer() จะคืนค่าเป็น vector ชนิด numeric โดยค่าในถังแรกจะเป็น 0 ถังที่สองเป็น 1 ถังที่สามเป็น 2 และต่อไปเรื่อย ๆ หากต้องการนำผลลัพธ์ไปใช้งานใน R ต้องแปลงเป็น factor ด้วยตนเอง รูปแบบโค้ดที่ใช้บ่อยมีดังนี้
a_tibble %>%
ft_bucketizer("x", "x_buckets", splits = splits) %>%
collect() %>%
mutate(x_buckets = factor(x_buckets, labels = labels))
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
แนะนำ Spark ด้วย sparklyr ใน R
คำแนะนำการฝึกหัด
มีการสร้าง Spark connection ไว้ให้แล้วในชื่อ spark_conn และ tibble ที่เชื่อมต่อกับ track metadata ที่เก็บอยู่ใน Spark ถูกกำหนดไว้ล่วงหน้าในชื่อ track_metadata_tbl โดยที่ decades คือลำดับตัวเลข 1920, 1930, …, 2020 และ decade_labels คือคำอธิบายของแต่ละทศวรรษในรูปแบบข้อความ
- สร้างตัวแปรชื่อ
hotttnesss_over_timeจากtrack_metadata_tbl- เลือกฟิลด์
artist_hotttnesssและyear - แปลงคอลัมน์
yearให้เป็นnumeric - ใช้
ft_bucketizer()เพื่อสร้างฟิลด์ใหม่ชื่อdecadeซึ่งแบ่งปีออกโดยใช้decades - เก็บรวบรวมผลลัพธ์
- แปลงฟิลด์
decadeให้เป็น factor โดยใช้ label จากdecade_labels
- เลือกฟิลด์
- วาดกราฟ
ggplot()แบบ boxplot ของartist_hotttnesssจำแนกตามdecade- argument แรกของ
ggplot()คือ argument ข้อมูล ได้แก่hotttnesss_over_time - argument ที่สองของ
ggplot()คือ aesthetic ซึ่งรับdecadeและartist_hotttnesssที่ห่อด้วยaes() - เพิ่ม
geom_boxplot()เพื่อวาดกราฟ
- argument แรกของ
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# 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(___, ___)) +
___()