簡體   English   中英

按每個鍵中的列對data.table進行排序

[英]sort data.table by a column within each key

我有一個帶有鍵xy的data.table,我想按每個鍵中的z列進行排序。

> DT
    x y          z
 1: a a  0.5526312
 2: a a  0.6339102
 3: a a -0.7490821
 4: a a -0.6850176
 5: a a  1.7943156
 6: a b  0.9271090
 7: a b  1.3936642
 8: a b  1.4815404
 9: a b -0.7850981
10: a b -1.0487700
11: b c  1.5184297
12: b c -0.4640705
13: b c -0.6513462
14: b c -0.5568319
15: b c  1.5422990
16: b d  0.8810654
17: b d -0.1895812
18: b d -2.6263378
19: b d  0.7371594
20: b d  1.4122076

我的第一次嘗試是DT[order(z), .SD, by = list(x, y)] ,但是,這不會使鍵控列保持排序。 我知道我可以分兩個步驟進行操作:

DT <- DT[order(x, y, z)]
setkeyv(DT, c('x', 'y'))

但是,這似乎不是一個好習慣,因為您希望對鍵進行排序時,列z仍將保持排序。 我也不想將z設置為鍵,因為以后不打算將其用作鍵。 有沒有更優雅的方法來實現這一目標?

為什么不:

setkey(DT, x, y, z)
setkey(DT, x, y)

使用setkey對所有三列進行排序,然后通過重置將最后一列從鍵中刪除。 另外,為了解決您對所維護的排序的擔憂,已對其進行了記錄( data.table文檔的Details部分的data.table ):

排序是穩定的; 即,關系的順序(如果有)被保留。

這意味着,當你按xy ,你已經被排序之后 xy ,和z的訂單z任何一組內的x - y值將不受打擾,因為他們都領帶WRT的x - y

您可以設置包含z的鍵,然后取消設置。 它仍然在x和y內按z排序,但不再是鍵。

setkey(DT, x, y, z)
setkey(DT, x, y)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM