Saya menggunakan data.table dan ada banyak fungsi yang mengharuskan saya untuk menyetel kunci (misalnya X[Y]). Karena itu, saya ingin memahami apa yang dilakukan kunci untuk mengatur kunci dengan benar dalam tabel data saya.
Satu sumber yang saya baca adalah ?setkey.
setkey()mengurutkandata.tabledan menandainya sebagai diurutkan. Kolom yang diurutkan adalah kuncinya. Kuncinya dapat berupa kolom apa pun dalam urutan apa pun. Kolom selalu diurutkan dalam urutan menaik. Tabel diubah dengan referensi. Tidak ada salinan yang dibuat sama sekali, selain memori kerja sementara sebesar satu kolom.
Kesimpulan saya di sini adalah bahwa kunci akan "menyortir" data.table, menghasilkan efek yang sangat mirip dengan order(). Namun, itu tidak menjelaskan tujuan memiliki kunci.
FAQ data.table 3.2 dan 3.3 menjelaskan:
3.2 Saya tidak memiliki kunci di meja besar, tetapi pengelompokan masih sangat cepat. Mengapa demikian?
data.table menggunakan penyortiran radix. Ini secara signifikan lebih cepat daripada algoritma pengurutan lainnya. Radix secara khusus hanya untuk bilangan bulat, lihat
?base::sort.list(x,method="radix"). Ini juga salah satu alasan mengapasetkey()cepat. Jika tidak ada kunci yang disetel, atau kami mengelompokkan dalam urutan yang berbeda dari kunci tersebut, kami menyebutnya secara ad hoc oleh.3.3 Mengapa pengelompokan berdasarkan kolom dalam kunci lebih cepat daripada secara ad hoc?
Karena setiap grup berdekatan dalam RAM, sehingga meminimalkan pengambilan halaman, dan memori dapat disalin secara massal (
memcpydalam C) daripada mengulang dalam C.
Dari sini, saya rasa bahwa pengaturan kunci memungkinkan R untuk menggunakan "penyortiran radix" di atas algoritma lain, dan itulah mengapa ini lebih cepat.
Panduan mulai cepat 10 menit juga memiliki panduan tentang kunci.
- Kunci
Mari kita mulai dengan mempertimbangkan data.frame, khususnya nama rown (atau dalam bahasa Inggris, nama baris). Artinya, banyak nama yang menjadi satu baris. Beberapa nama yang termasuk dalam satu baris? Bukan itu yang biasa kita lakukan dalam data.frame. Kita tahu bahwa setiap baris paling banyak memiliki satu nama. Seseorang memiliki setidaknya dua nama, nama pertama dan nama kedua. Itu berguna untuk mengatur direktori telepon, misalnya, yang diurutkan berdasarkan nama belakang, lalu nama pertama. Namun, setiap baris dalam data.frame hanya dapat memiliki satu nama.
Kunci terdiri dari satu atau lebih kolom nama baris, yang mungkin berupa bilangan bulat, faktor, karakter atau kelas lain, bukan hanya karakter. Selanjutnya, baris tersebut diurutkan berdasarkan kunci. Oleh karena itu, data.table dapat memiliki paling banyak satu kunci, karena tidak dapat diurutkan dengan lebih dari satu cara.
Keunikan tidak diberlakukan, yaitu nilai kunci duplikat diperbolehkan. Karena baris diurutkan berdasarkan kunci, setiap duplikat dalam kunci akan muncul secara berurutan
Direktori telepon sangat membantu dalam memahami apa itu kunci, tetapi tampaknya kunci tidak berbeda jika dibandingkan dengan memiliki kolom faktor. Lebih lanjut, tidak dijelaskan mengapa sebuah key dibutuhkan (terutama untuk menggunakan fungsi tertentu) dan bagaimana memilih kolom yang akan dijadikan key. Juga, tampaknya dalam data.table dengan waktu sebagai kolom, mengatur kolom lain sebagai kunci mungkin akan mengacaukan kolom waktu juga, yang membuatnya semakin membingungkan karena saya tidak tahu apakah saya diizinkan mengatur kolom lain sebagai kunci. Bisakah seseorang mencerahkan saya?