เริ่มต้นใช้งานเริ่มต้นใช้งานได้ฟรี

แยกข้อมูลด้วย keep() และ discard()

เราต้องการแบ่งผลลัพธ์ออกเป็นสองกลุ่ม ได้แก่ วันที่มีค่าเกิน 100 และวันที่มีค่าต่ำกว่า 100 โดยจะใช้ keep() และ discard() ร่วมกัน

ทำไมต้องใช้สองฟังก์ชัน? ใช้ฟังก์ชันเดียวไม่ได้หรือ? หรือสร้าง mapper ชื่อ is_less_than_hundred ขึ้นมาเลยไม่ดีกว่าหรือ?

ทำได้ แต่จะเสี่ยงต่อความผิดพลาดมากกว่า เพราะการสลับระหว่าง keep() กับ discard() ทำได้ง่ายกว่าการคัดลอกและวางโค้ด เมื่อใช้ทั้งสองฟังก์ชันร่วมกัน เราจำเป็นต้องมี mapper เพียงตัวเดียว นั่นหมายความว่าหากต้องการเปลี่ยน threshold เราแก้ไขแค่ที่เดียว ไม่ต้องแก้สองที่เหมือนกรณีที่มี mapper สองตัว

นี่คือหลักการที่ควรยึดถือเมื่อเขียนโค้ด นั่นคือเขียนโค้ดให้เป็นแบบที่หากต้องการเปลี่ยนแปลงสิ่งใด ก็แก้ไขเพียงครั้งเดียวก็พอ

all_visits ยังคงพร้อมใช้งานใน workspace ของคุณ

แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร

Functional Programming ระดับกลางด้วย purrr

ดูคอร์ส

คำแนะนำการฝึกหัด

  • ใช้ฟังก์ชัน set_names() กับ all_visits เพื่อเพิ่มชื่อวันลงไป แล้วเก็บผลไว้ใน all_visits_named
  • สร้าง mapper ชื่อ threshold เพื่อทดสอบว่า .x มีค่าเกิน 100 หรือไม่
  • สร้าง group_over โดยเก็บเฉพาะองค์ประกอบที่มีค่าเกิน 100
  • สร้าง group_under โดยตัดทิ้งองค์ประกอบที่มีค่าเกิน 100

แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ

ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์

# Set the name of each subvector
day <- c("mon", "tue", "wed", "thu", "fri", "sat", "sun")
all_visits_named <- ___(all_visits, ~ ___(.x, ___))

# Create a mapper that will test if .x is over 100 
threshold <- ___

# Run this mapper on the all_visits_named object: group_over
group_over <- ___(all_visits_named, ~ ___(.x, ___))

# Run this mapper on the all_visits_named object: group_under
group_under <-  ___(all_visits_named, ~ ___(.x, ___))
แก้ไขและรันโค้ด