r - 按每个键中的列对 data.table 进行排序

标签 r data.table

我有一个包含键 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 文档的详细信息部分的第 2 段):

The sort is stable; i.e., the order of ties (if any) is preserved.

这意味着当您按 xy 排序时,您按 x 排序后,yzz 在任何 x-y 集合中的顺序值将不受干扰,因为它们都与 x-y 值相关

关于r - 按每个键中的列对 data.table 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22766100/

相关文章:

r - 查找 "local maximas"但忽略小于最高值 20% 的值

r - 在 R 的另一个函数中使用 data.table

r - 如何在双y轴ggplot上显示图例

r - data.table:将setkey与列名变量一起使用

R - Data.table - 在 RHS 操作中使用变量列名

reshape R : split a column

r - ggplot 饼图中的标签错误

r - 在巨大矩阵上应用运算时不允许使用负长度向量

r - 在 for 循环中 dcast 多个数据帧

r - 如何防止索引/键重复的行附加到data.frame?