ฉันใช้ data.table และมีฟังก์ชั่นมากมายที่ทำให้ฉันต้องตั้งค่าคีย์ (เช่นX[Y]
) ด้วยเหตุนี้ฉันจึงต้องการทำความเข้าใจว่าคีย์ทำอะไรเพื่อที่จะตั้งค่าคีย์ในตารางข้อมูลของฉันได้อย่างถูกต้อง
?setkey
แหล่งข่าวคนหนึ่งผมอ่านเป็น
setkey()
จัดเรียง adata.table
และทำเครื่องหมายว่าเรียงลำดับแล้ว คอลัมน์ที่จัดเรียงเป็นกุญแจสำคัญ คีย์สามารถเป็นคอลัมน์ใดก็ได้ในลำดับใดก็ได้ คอลัมน์จะเรียงลำดับจากน้อยไปมากเสมอ ตารางมีการเปลี่ยนแปลงโดยการอ้างอิง ไม่มีการทำสำเนาเลยนอกจากหน่วยความจำที่ใช้งานได้ชั่วคราวที่มีขนาดใหญ่เท่ากับคอลัมน์
Takeaway ของฉันที่นี่คือคีย์จะ "เรียงลำดับ" data.table ซึ่งส่งผลให้เกิดผลคล้ายกับorder()
. อย่างไรก็ตามมันไม่ได้อธิบายวัตถุประสงค์ของการมีคีย์
คำถามที่พบบ่อย data.table 3.2 และ 3.3 อธิบาย:
3.2 ฉันไม่มีคีย์บนโต๊ะขนาดใหญ่ แต่การจัดกลุ่มยังเร็วมาก ทำไมถึงเป็นเช่นนั้น?
data.table ใช้การเรียงลำดับเลขฐาน ซึ่งเร็วกว่าอัลกอริทึมการจัดเรียงอื่น ๆ อย่างเห็นได้ชัด Radix เป็น specically
?base::sort.list(x,method="radix")
สำหรับจำนวนเต็มเท่านั้นดู นี่เป็นสาเหตุหนึ่งที่ทำให้setkey()
รวดเร็ว เมื่อไม่มีการตั้งค่าคีย์หรือเราจัดกลุ่มในลำดับที่แตกต่างจากคีย์เราเรียกว่าคีย์เฉพาะกิจโดย3.3 เหตุใดการจัดกลุ่มตามคอลัมน์ในคีย์จึงเร็วกว่าเฉพาะกิจโดย?
เนื่องจากแต่ละกลุ่มอยู่ติดกันใน RAM จึงลดการดึงข้อมูลเพจและสามารถคัดลอกหน่วยความจำเป็นกลุ่ม (
memcpy
ใน C) แทนที่จะวนซ้ำใน C
จากตรงนี้ฉันเดาว่าการตั้งค่าคีย์ทำให้ R สามารถใช้ "การเรียงลำดับเรดิกซ์" เหนืออัลกอริทึมอื่น ๆ ได้และนั่นคือสาเหตุที่เร็วกว่า
คู่มือเริ่มใช้งานฉบับย่อ 10 นาทียังมีคำแนะนำเกี่ยวกับปุ่มต่างๆ
- คีย์
เริ่มต้นด้วยการพิจารณา data.frame ชื่อแถวเฉพาะ (หรือในภาษาอังกฤษชื่อแถว) นั่นคือหลายชื่อที่อยู่ในแถวเดียว หลายชื่อที่อยู่ในแถวเดียว? นั่นไม่ใช่สิ่งที่เราคุ้นเคยใน data.frame เรารู้ว่าแต่ละแถวมีชื่อมากที่สุดหนึ่งชื่อ บุคคลมีชื่ออย่างน้อยสองชื่อชื่อ rst และชื่อที่สอง ซึ่งมีประโยชน์ในการจัดระเบียบสมุดโทรศัพท์เช่นจัดเรียงตามนามสกุลแล้วตามด้วยชื่อ rst อย่างไรก็ตามแต่ละแถวใน data.frame สามารถมีได้เพียงชื่อเดียว
คีย์ประกอบด้วยคอลัมน์อย่างน้อยหนึ่งคอลัมน์ของชื่อแถวซึ่งอาจเป็นจำนวนเต็มตัวประกอบอักขระหรือคลาสอื่น ๆ ไม่ใช่แค่อักขระ นอกจากนี้แถวจะเรียงตามคีย์ ดังนั้น data.table สามารถมีได้ไม่เกินหนึ่งคีย์เนื่องจากไม่สามารถจัดเรียงได้มากกว่าหนึ่งวิธี
ไม่มีการบังคับใช้ความเป็นเอกลักษณ์กล่าวคืออนุญาตให้มีค่าคีย์ที่ซ้ำกัน เนื่องจากแถวเรียงตามคีย์รายการที่ซ้ำกันในคีย์จะปรากฏขึ้นตามลำดับ
สมุดโทรศัพท์มีประโยชน์ในการทำความเข้าใจว่าคีย์คืออะไร แต่ดูเหมือนว่าคีย์จะไม่แตกต่างกันเมื่อเทียบกับการมีคอลัมน์แฟคเตอร์ นอกจากนี้ยังไม่ได้อธิบายว่าเหตุใดจึงจำเป็นต้องมีคีย์ (โดยเฉพาะอย่างยิ่งในการใช้ฟังก์ชันบางอย่าง) และวิธีการเลือกคอลัมน์เพื่อกำหนดเป็นคีย์ นอกจากนี้ดูเหมือนว่าใน data.table ที่มีเวลาเป็นคอลัมน์การตั้งค่าคอลัมน์อื่น ๆ เป็นคีย์อาจทำให้คอลัมน์เวลายุ่งเกินไปซึ่งทำให้สับสนมากขึ้นเนื่องจากฉันไม่รู้ว่าฉันได้รับอนุญาตให้ตั้งค่าคอลัมน์อื่นเป็นหรือไม่ สำคัญ. ใครช่วยสอนฉันหน่อยได้ไหม