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.