我有一个包含键 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
文档的详细信息部分的第 2 段):
The sort is stable; i.e., the order of ties (if any) is preserved.
这意味着当您按 x
和 y
排序时,在您按 x
排序后,y
和 z
,z
在任何 x
-y
集合中的顺序值将不受干扰,因为它们都与 x
-y
值相关
关于r - 按每个键中的列对 data.table 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22766100/