如何重新排列 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

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

88453 次浏览

使用 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了解详细信息。

人们可能会发现使用上述解决方案更容易,而不是按列号排序。例如: 库(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