Tôi đang sử dụng data.table và có nhiều chức năng yêu cầu tôi đặt khóa (ví dụ X[Y]
:). Do đó, tôi muốn hiểu khóa làm gì để đặt đúng khóa trong bảng dữ liệu của mình.
Tôi đã đọc một nguồn ?setkey
.
setkey()
sắp xếp adata.table
và đánh dấu là đã sắp xếp. Các cột được sắp xếp là chìa khóa. Chìa khóa có thể là bất kỳ cột nào theo thứ tự bất kỳ. Các cột luôn được sắp xếp theo thứ tự tăng dần. Bảng được thay đổi theo tham chiếu. Không có bản sao nào được thực hiện, ngoài bộ nhớ làm việc tạm thời lớn như một cột.
Bài học của tôi ở đây là một khóa sẽ "sắp xếp" data.table, dẫn đến hiệu ứng rất giống với order()
. Tuy nhiên, nó không giải thích mục đích của việc có chìa khóa.
Câu hỏi thường gặp về data.table 3.2 và 3.3 giải thích:
3.2 Tôi không có chìa khóa trên một bảng lớn, nhưng việc nhóm vẫn thực sự nhanh chóng. Tại sao vậy?
data.table sử dụng sắp xếp theo cơ số. Điều này nhanh hơn đáng kể so với các thuật toán sắp xếp khác. Radix đặc biệt chỉ dành cho số nguyên, hãy xem
?base::sort.list(x,method="radix")
. Đây cũng là một lý do tại saosetkey()
nhanh chóng. Khi không có khóa nào được đặt hoặc chúng tôi nhóm theo thứ tự khác với thứ tự của khóa, chúng tôi gọi nó là đặc biệt bởi.3.3 Tại sao nhóm theo cột trong khóa nhanh hơn nhóm đặc biệt theo?
Bởi vì mỗi nhóm nằm kề nhau trong RAM, do đó giảm thiểu việc tìm nạp trang và bộ nhớ có thể được sao chép hàng loạt (
memcpy
trong C) thay vì lặp lại trong C.
Từ đây, tôi đoán rằng việc thiết lập khóa bằng cách nào đó cho phép R sử dụng "sắp xếp theo cơ số" so với các thuật toán khác và đó là lý do tại sao nó nhanh hơn.
Hướng dẫn bắt đầu nhanh 10 phút cũng có hướng dẫn về các phím.
- Chìa khóa
Hãy bắt đầu bằng cách xem xét data.frame, cụ thể là tên hàng (hoặc bằng tiếng Anh, tên hàng). Đó là, nhiều tên thuộc một hàng. Nhiều tên thuộc một hàng? Đó không phải là những gì chúng ta quen làm trong data.frame. Chúng ta biết rằng mỗi hàng có nhiều nhất một tên. Một người có ít nhất hai tên, tên đầu tiên và tên thứ hai. Điều đó rất hữu ích để tổ chức một danh bạ điện thoại, ví dụ, được sắp xếp theo họ, sau đó là tên. Tuy nhiên, mỗi hàng trong data.frame chỉ có thể có một tên.
Một khóa bao gồm một hoặc nhiều cột tên hàng, có thể là số nguyên, hệ số, ký tự hoặc một số lớp khác, không chỉ là ký tự. Hơn nữa, các hàng được sắp xếp theo khóa. Do đó, một data.table có thể có nhiều nhất một khóa, vì nó không thể được sắp xếp theo nhiều cách.
Tính duy nhất không được thực thi, tức là cho phép các giá trị khóa trùng lặp. Vì các hàng được sắp xếp theo khóa nên mọi bản sao trong khóa sẽ xuất hiện liên tiếp
Danh bạ điện thoại hữu ích trong việc hiểu khóa là gì, nhưng có vẻ như khóa không khác gì khi so sánh với việc có cột yếu tố. Hơn nữa, nó không giải thích tại sao lại cần một khóa (đặc biệt là để sử dụng một số chức năng nhất định) và cách chọn cột để đặt làm khóa. Ngoài ra, có vẻ như trong data.table với thời gian là một cột, việc đặt bất kỳ cột nào khác làm khóa cũng có thể làm rối cột thời gian, điều này khiến nó thậm chí còn khó hiểu hơn vì tôi không biết liệu mình có được phép đặt bất kỳ cột nào khác không Chìa khóa. Ai đó có thể khai sáng cho tôi được không?