【问题标题】:How to reorder data.table columns (without copying)如何重新排序 data.table 列(不复制)
【发布时间】:2012-08-27 06:10:17
【问题描述】:

我想重新排序我的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

但这需要再次复制整个数据集。有没有其他方法可以做到这一点?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    使用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

    【讨论】:

    • 小说明:setcolorder 在不使用任何工作内存的情况下移动列指针。关于使用一列大小的工作内存的那句话真的是setkey
    • @MatthewDowle - 感谢您的澄清。我有点认为可能是这种情况,但不是 100% 确定。
    • 我可以对一部分列执行此操作吗?例如,当我只想移动到前面的列时?
    • setcolorder(df, c("someCol",colnames(dt)[!(colnames(dt) %in% c("someCol"))]))
    • @PeterPan 另见NEWS about the devel version 1.10.5:“setcolorder() 现在接受的列数少于ncol(DT) 被移到前面”
    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 2013-04-14
    • 2021-11-21
    • 2020-10-14
    • 2019-09-18
    • 1970-01-01
    • 2018-06-01
    • 2016-12-20
    • 2011-03-04
    相关资源
    最近更新 更多