data.table列を並べ替える方法(コピーなし)


118

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

しかし、それにはデータセット全体を再度コピーする必要があります。これを行う別の方法はありますか?

回答:


183

使用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*の機能は、参照によりその入力を変更します。つまり、1カラムほどの大きさの一時作業メモリを除いて、コピーはまったく作成されません。

だからかなり効率的でなければなりません。詳細?setcolorderについては、を参照してください。


21
小さな説明:setcolorder作業メモリをまったく使用せずに列ポインタを移動します。1つの列ほどの大きさの作業メモリの使用に関するその文章は、まさにその通りsetkeyです。
Matt Dowle、2012

2
@MatthewDowle-明確化に感謝します。私はそうだったのかもしれないと思っていましたが、100%確実ではありませんでした。
追跡

3
列のサブセットに対してそれを行うことができますか?たとえば、列の前に移動したいだけですか?
Peter Pan

5
setcolorder(df, c("someCol",colnames(dt)[!(colnames(dt) %in% c("someCol"))]))
hedgedandlevered

6
@PeterPan開発バージョン1.10.5に関するNEWSも参照してください:「フロントに移動する列setcolorder()より少ないncol(DT)列を受け入れるようになりました」
Henrik

12

上記のソリューションを使用する方が簡単かもしれませんが、代わりに列番号でソートします。例: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(3,2,1))
    > x
         c         b a
    [1,] 0.2880365 3 1
    [2,] 0.7785115 2 2
    [3,] 0.3297416 1 3

13
一般に、data.tableやその他の場所で列を番号で参照することはお勧めしません。data.tableのfaqは、最初の項目のdatatable.r-forge.r-project.org/datatable-faq.pdf
Frank
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.