2013-03-21 28 views
12

phép nói rằng tôi có một DT bảng dữ liệu và thay đổi thứ tự với thiết lập chínhLàm thế nào để bạn hoàn tác một yêu cầu đặt khóa trong data.table?

setkey(DT,mykey) 

Sau đó, có lẽ tôi tham gia một số điều từ bảng khác.

DT=DT2[DT] 

Có cách nào để khôi phục đơn đặt hàng ban đầu của tôi không? Tôi biết, tôi có thể làm điều đó bằng cách bao gồm một chỉ mục rõ ràng trước khi tôi sử dụng setkey.

N=Nrow(DT) 
DT[,orig_index:=1:N] 
setkey(DT,mykey) 
DT=DT2[DT] 
setkey(DT,orig_index) 
DT[,orig_index:=NULL] 

Có cách nào đơn giản hơn không? Nếu tôi đã làm điều này với thứ tự thay vì đặt khóa, điều này sẽ đơn giản hơn một chút.

o=order(DT$mykey) 
uo=order(o) 
setkey(DT,mykey) 
DT=DT2[DT] 
DT=DT[uo,] 

nó sẽ là loại mát mẻ Tôi đoán nếu setkey có thể bị đảo ngược với một cái gì đó như thế này

setkey(DT,mykey,save.unset=T) 
DT=DT2[DT] 
unsetkey(DT) 

Đây save.unset = T sẽ nói data.table để cứu sắp xếp lại cuối cùng để nó có thể được đảo ngược.

Hơn thế nữa, có lẽ

setkey(DT, reorder=F) 
DT=DT2[DT] 

Tùy chọn này sẽ nói với data.table sử dụng thứ tự quan trọng cho tham gia hoặc bất cứ điều gì mà không thực sự thay đổi thứ tự của DT. Không chắc chắn nếu điều đó là có thể hoặc tự nhiên để thực hiện.

+1

Tôi không nhận thức được một cách để làm điều này như vậy trong data.table. Tôi nhớ một yêu cầu tính năng tương tự trên * không tự động sắp xếp lại các cột chính * và Matthew sử dụng nó một cách vui vẻ như một yêu cầu tính năng. Vì vậy, tôi sẽ giả sử Matthew, khi ông kiểm tra bài đăng này, sẽ không nhớ thêm điều này như là một yêu cầu tính năng (trừ khi có một lý do cụ thể). Tôi nghĩ rằng tính năng này có thể có ích trong thời gian quá. – Arun

Trả lời

5

Đồng ý. Đây là những gì chúng tôi đang gọi là một khóa thứ cấp và kế hoạch là để thêm set2key để làm chính xác điều đó. Có thể thực hiện các khóa phụ thủ công ngay bây giờ. Nhưng điều đó rất giống với những gì bạn có trong câu hỏi. Nó đã xuất hiện khá nhiều.

FR#1007 Build in secondary keys

và một số ví dụ:

https://stackoverflow.com/a/13660454/403310
https://stackoverflow.com/a/13969805/403310

Các vấn đề liên quan