2014-03-31 98 views
2

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

> 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設置爲關鍵字,因爲它以後不會用作關鍵字。有沒有更好的方法來實現這個目標?

+1

如果您將鍵保留爲「x,y,z」,問題究竟是什麼? – Arun

+0

@阿倫:這可能不成問題。我可能會加入這個data.table與其他data.table只有x和y鍵,所以我認爲這可能是一個好主意,保持簡單。 – ezbentley

回答

3

爲什麼不:

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

使用setkey由所有三列進行排序,然後將其復位刪除關鍵的最後一列。此外,解決您在那種關注維持,它是記錄(data.table文檔的細節部分的第2段):

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

這意味着,當你按xy後,您已通過xy,並且z,分類任何一套x內的z訂單 - y值將不受打擾,因爲他們都領帶關於x - y

+0

我其實已經想過了,但不確定當按鍵被重置時我是否應該依靠'z'仍然被排序。 – ezbentley

+0

@ezbentley,請參閱答案更新。 – BrodieG

+0

謝謝。我不確定這種排序是否穩定。 – ezbentley

1

您可以設置包含z的密鑰然後取消設置。它仍然按x和y排序,但它不再是一個關鍵。

setkey(DT, x, y, z) 
setkey(DT, x, y) 
相關問題