我想data.table根据给定的索引序列对 a 的行重新排序,这就是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
Run Code Online (Sandbox Code Playgroud)
neworder 应该是新排序的“查找索引”,例如 neworder = c(3, 1, 2) 将第 3 行作为新的第一行,将第 1 行作为新的第二行,等等......
# 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
Run Code Online (Sandbox Code Playgroud)
正如评论中所指出的,我认为摆脱捕获行排序的列是一个坏主意,但您可以制作一个包装器来摆脱它,就像在其他答案中一样。
1:.N如果.I此处讨论的更改行为,则可能需要在未来版本中使用:https : //github.com/Rdatatable/data.table/issues/2598
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |