[英]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.