[英]sort data.table by a column within each key
我有一個帶有鍵x
和y
的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
):
排序是穩定的; 即,關系的順序(如果有)被保留。
這意味着,當你按x
和y
,你已經被排序之后 x
, y
,和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.