Come riordinare le colonne data.table (senza copiare)


118

Mi piacerebbe colonne di riordino nella mia data.table x, dato un carattere vettoriale di nomi di colonna, neworder:

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

Ovviamente potrei fare:

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

ma ciò richiederebbe nuovamente la copia dell'intero set di dati. c'è un altro modo per fare ciò?

Risposte:


183

Usa 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

Da ?setcolorder:

In data.tablegergo, tutte le set*funzioni cambiano il loro input per riferimento. Cioè, non viene eseguita alcuna copia, a parte la memoria di lavoro temporanea, che è grande quanto una colonna.

quindi dovrebbe essere abbastanza efficiente. Vedere ?setcolorderper i dettagli.


21
Piccola precisazione: setcolordersposta i puntatori di colonna senza utilizzare alcuna memoria di lavoro. Quella frase sull'uso della memoria di lavoro grande quanto una colonna è setkeydavvero.
Matt Dowle

2
@ MatthewDowle - grazie per il chiarimento. Ho pensato che potesse essere il caso, ma non ne ero sicuro al 100%.
Chase

3
posso farlo per un sottoinsieme di colonne? Ad esempio, quando voglio solo passare alle colonne in primo piano?
Peter Pan

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

6
@PeterPan Vedi anche NOTIZIE sulla versione di sviluppo 1.10.5 : " setcolorder()ora accetta meno ncol(DT)colonne da spostare in primo piano"
Henrik

12

Si potrebbe trovare più facile usare la soluzione di cui sopra, ma invece ordinare per numero di colonna. Ad esempio: 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
In genere è sconsigliato fare riferimento alle colonne per numero, in data.table e altrove. Le domande frequenti su data.table forniscono l'argomento per questo nel primo elemento qui: datatable.r-forge.r-project.org/datatable-faq.pdf
Frank
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.