我想根据一些给定的索引序列对 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/

10-13 06:33