如何重新排序data.table列(无需复制)

时间:2012-09-01 22:47:27

标签: r data.table

我想在我的data.table x中对列进行重新排序,给定一个列名称为neworder的字符向量:

library(data.table)
x <- data.table(a = 1:3, b = 3:1, c = runif(3))
neworder <- c("c", "b", "a")

显然我可以这样做:

x[ , neworder, with = FALSE]
# or
x[ , ..neworder]
#            c b a
# 1: 0.8476623 3 1
# 2: 0.4787768 2 2
# 3: 0.3570803 1 3

但这需要再次复制整个数据集。还有另一种方法吗?

2 个答案:

答案 0 :(得分:161)

使用setcolorder()

library(data.table)
x <- data.table(a = 1:3, b = 3:1, c = runif(3))
x
#      a b         c
# [1,] 1 3 0.2880365
# [2,] 2 2 0.7785115
# [3,] 3 1 0.3297416
setcolorder(x, c("c", "b", "a"))
x
#              c b a
# [1,] 0.2880365 3 1
# [2,] 0.7785115 2 2
# [3,] 0.3297416 1 3

来自?setcolorder

  

data.table用语中,所有set*函数都通过引用更改其输入。也就是说,除了临时工作存储器之外,根本不会复制任何副本,而临时工作存储器就像一列一样大。

所以应该非常有效率。有关详细信息,请参阅?setcolorder

答案 1 :(得分:8)

有人可能会发现使用上述解决方案更容易,而是按列号排序。例如:         库(data.table)

    > x <- data.table(a = 1:3, b = 3:1, c = runif(3))
    > x
         a b         c
    [1,] 1 3 0.2880365
    [2,] 2 2 0.7785115
    [3,] 3 1 0.3297416
    > setcolorder(x, c(3,2,1))
    > x
         c         b a
    [1,] 0.2880365 3 1
    [2,] 0.7785115 2 2
    [3,] 0.3297416 1 3