Cara menyusun ulang kolom data.table (tanpa menyalin)

118

Saya ingin kolom menyusun ulang di saya data.table x, diberikan vektor karakter nama kolom, neworder:

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

Jelas saya bisa melakukan:

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

tapi itu perlu menyalin seluruh dataset lagi. Apakah ada cara lain untuk melakukan ini?

Michael
sumber

Jawaban:

183

Penggunaan 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

Dari ?setcolorder:

Dalam data.tablebahasa Inggris, semua set*fungsi mengubah masukannya dengan referensi. Artinya, tidak ada salinan yang dibuat sama sekali, selain memori kerja sementara, yang ukurannya sebesar satu kolom.

jadi seharusnya cukup efisien. Lihat ?setcolorderdetailnya.

Mengejar
sumber
21
Klarifikasi kecil: setcolordermemindahkan penunjuk kolom tanpa menggunakan memori kerja sama sekali. Kalimat tentang menggunakan memori kerja sebesar satu kolom itu setkeybenar - benar.
Matt Dowle
2
@MatthewDowle - terima kasih atas klarifikasinya. Saya agak berpikir itu mungkin masalahnya, tetapi tidak 100% yakin.
Mengejar
3
dapatkah saya melakukannya untuk subset kolom? Misalnya ketika saya hanya ingin pindah ke kolom ke depan?
Peter Pan
5
setcolorder(df, c("someCol",colnames(dt)[!(colnames(dt) %in% c("someCol"))]))
hedgedandlevered
6
@PeterPan Lihat juga BERITA tentang pengembangan versi 1.10.5 : " setcolorder()sekarang menerima kurang dari ncol(DT)kolom untuk dipindahkan ke depan"
Henrik
12

Seseorang mungkin merasa lebih mudah untuk menggunakan solusi di atas, tetapi mengurutkan berdasarkan nomor kolom. Contoh: 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
Stephen
sumber
13
Biasanya tidak disarankan untuk merujuk ke kolom dengan nomor, di data.table dan di tempat lain. FAQ data.table membuat argumen untuk ini di item pertama di sini: datatable.r-forge.r-project.org/datatable-faq.pdf
Frank