如何重新sortingdata.table列(不复制)
我想重新排列我的data.table
x
列,给定一个列名称的字符向量data.table
:
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] # cba # 1: 0.8476623 3 1 # 2: 0.4787768 2 2 # 3: 0.3570803 1 3
但是这需要再次复制整个数据集。 有没有另外一种方法来做到这一点?
使用setcolorder()
:
library(data.table) x <- data.table(a = 1:3, b = 3:1, c = runif(3)) x # abc # [1,] 1 3 0.2880365 # [2,] 2 2 0.7785115 # [3,] 3 1 0.3297416 setcolorder(x, c("c", "b", "a")) x # cba # [1,] 0.2880365 3 1 # [2,] 0.7785115 2 2 # [3,] 0.3297416 1 3
来自?setcolorder
:
按照
data.table
说法,所有set*
函数都通过引用来改变它们的input。 也就是说,除了临时工作存储器之外,完全不做任何复制,只有一列大小的临时工作存储器。
所以应该非常高效。 有关详细信息,请参阅?setcolorder
。
有人可能会发现使用上述解决scheme更容易,而是按列号sorting。 例如:library(data.table)
> x <- data.table(a = 1:3, b = 3:1, c = runif(3)) > x abc [1,] 1 3 0.2880365 [2,] 2 2 0.7785115 [3,] 3 1 0.3297416 > setcolorder(x, c(3,2,1)) > x cba [1,] 0.2880365 3 1 [2,] 0.7785115 2 2 [3,] 0.3297416 1 3