我想根据一些给定的索引序列对 data.table
的行重新排序,这就是 setcolorder
对列所做的。有这个功能吗?
这是一个可重现的示例,具有预期的输出。
> DT = data.table(mtcars, keep.rownames=TRUE)[1:3]
> DT
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2: Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3: Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
> ord = c(3,1,2)
> setroworder(DT, ord)
> DT
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
2: Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
3: Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
最佳答案
# example
DT = data.table(mtcars, keep.rownames=TRUE)[1:3]
ord = c(3,1,2)
DT
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2: Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3: Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
# use DT[ord, do_stuff]:
setorderv(DT[ord, .rn := .I], ".rn")[]
rn mpg cyl disp hp drat wt qsec vs am gear carb .rn
1: Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 1
2: Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 2
3: Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 3
正如评论中所指出的,我认为摆脱捕获行排序的列是一个坏主意,但您可以制作一个包装器来摆脱它,就像在其他答案中一样。
如果
1:.N
的行为如此处讨论的那样更改,则可能需要在 future 版本中使用 .I
:https://github.com/Rdatatable/data.table/issues/2598关于r - 是否有类似 `setorder` 的 `setcolorder` 版本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56759013/