Data.table sütunları nasıl yeniden sıralanır (kopyalamadan)


118

data.table xSütun adlarının bir karakter vektörü verildiğinde, sütunlarımda yeniden sıralamak istiyorum neworder:

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

Açıkçası yapabilirim:

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

ancak bu, tüm veri kümesinin yeniden kopyalanmasını gerektirir. Bunu yapmanın başka bir yolu var mı?

Yanıtlar:


183

Kullanım 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

Kimden ?setcolorder:

Kısaca data.table, tüm set*işlevler girişlerini referans olarak değiştirir. Yani, bir sütun kadar büyük olan geçici çalışma belleği dışında hiçbir şekilde kopyalama yapılmaz.

bu yüzden oldukça verimli olmalı. Ayrıntılar ?setcolorderiçin bakın.


21
Küçük açıklama: setcolorderHiçbir çalışma belleği kullanmadan sütun işaretçilerini hareket ettirir. Bir sütun kadar büyük olan çalışma belleğini kullanmakla ilgili bu cümle neredeyse setkeygerçekten.
Matt Dowle 02

2
@MatthewDowle - açıklama için teşekkürler. Durumun böyle olabileceğini düşündüm, ancak% 100 emin değildim.
Chase

3
bunu bir sütun alt kümesi için yapabilir miyim? Örneğin, sadece ön taraftaki sütunlara geçmek istediğimde?
Peter Pan

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

6
@PeterPan Devel 1.10.5 sürümüyle ilgili HABERLER'e de bakın : " setcolorder()şimdi ncol(DT)öne taşınacak sütunlardan daha azını kabul ediyor "
Henrik

12

Yukarıdaki çözümü kullanmak daha kolay bulabilir, bunun yerine sütun numarasına göre sıralayın. Örneğin: 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
Genelde data.table'da ve başka yerlerde sütunlara numara ile atıfta bulunmak tavsiye edilmez. Data.table SSS, buradaki ilk maddede bunun için argümanı yapar: datatable.r-forge.r-project.org/datatable-faq.pdf
Frank
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.