繁体   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