การจัดกลุ่ม: ดีสำหรับดนตรี ดีสำหรับข้อมูล
ปัญหาที่พบบ่อยในการวิเคราะห์ข้อมูลคือการคำนวณสถิติสรุปสำหรับแต่ละกลุ่มข้อมูล ตัวอย่างเช่น อาจต้องการทราบรายได้จากการขายแยกตามเดือนหรือตามภูมิภาค ใน R กระบวนการแบ่งข้อมูลออกเป็นกลุ่ม นำสถิติสรุปไปใช้กับแต่ละกลุ่ม แล้วรวมผลลัพธ์กลับเป็นโครงสร้างข้อมูลเดียว เรียกว่า "split-apply-combine" แนวคิดนี้มีมานานแล้ว SQL มีคำสั่ง GROUP BY มาหลายสิบปี และคำว่า "map-reduce" ก็เป็นแนวคิดที่คล้ายกัน โดย "map" เปรียบได้คร่าว ๆ กับขั้นตอน "split" และ "apply" ส่วน "reduce" คือการ "combine" แนวทางของ dplyr/sparklyr คือใช้ group_by() ก่อนที่จะเรียก mutate() หรือ summarize() โดยรับชื่อคอลัมน์ที่ต้องการจัดกลุ่มแบบไม่ใส่เครื่องหมายคำพูด ตัวอย่างเช่น หากต้องการคำนวณค่าเฉลี่ยของคอลัมน์ x สำหรับแต่ละชุดค่าในคอลัมน์ grp1 และ grp2 สามารถเขียนได้ดังนี้
a_tibble %>%
group_by(grp1, grp2) %>%
summarize(mean_x = mean(x))
โปรดทราบว่าคอลัมน์ที่ส่งให้ group_by() ควรเป็นตัวแปรเชิงหมวดหมู่ ตัวอย่างเช่น หากต้องการคำนวณน้ำหนักเฉลี่ยของบุคคลตามส่วนสูง การจัดกลุ่มตามส่วนสูงโดยตรงไม่สมเหตุสมผล เนื่องจากส่วนสูงของแต่ละคนไม่ซ้ำกัน อย่างไรก็ตาม สามารถใช้ cut() เพื่อแปลงส่วนสูงให้เป็นหมวดหมู่ต่าง ๆ แล้วคำนวณน้ำหนักเฉลี่ยของแต่ละหมวดหมู่ได้
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
แนะนำ Spark ด้วย sparklyr ใน R
คำแนะนำการฝึกหัด
Spark connection ถูกสร้างไว้ให้แล้วในชื่อ spark_conn และ tibble ที่เชื่อมต่อกับข้อมูล track metadata ที่เก็บใน Spark ถูกกำหนดไว้ล่วงหน้าเป็น track_metadata_tbl
- จัดกลุ่มข้อมูลใน
track_metadataตามartist_nameจากนั้น:- สรุปค่าเฉลี่ยของ
durationแต่ละกลุ่มเป็นคอลัมน์ใหม่ชื่อmean_duration - กำหนดผลลัพธ์ให้กับตัวแปร
duration_by_artist
- สรุปค่าเฉลี่ยของ
- ค้นหาศิลปินที่มีเพลงสั้นที่สุดโดยเรียงลำดับแถวตาม
mean_durationจากน้อยไปมาก - ในทำนองเดียวกัน ค้นหาศิลปินที่มีเพลงยาวที่สุดโดยเรียงลำดับตาม
mean_durationจากมากไปน้อย
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# track_metadata_tbl has been pre-defined
track_metadata_tbl
duration_by_artist <- track_metadata_tbl %>%
# Group by artist
___ %>%
# Calc mean duration
___
duration_by_artist %>%
# Sort by ascending mean duration
___
duration_by_artist %>%
# Sort by descending mean duration
___