web-dev-qa-db-fra.com

Comment réorganiser les colonnes de data.table (sans les copier)

Je voudrais réorganiser les colonnes dans mon data.tablex, à partir d’un vecteur caractère de noms de colonnes, neworder:

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

Évidemment je pourrais faire:

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

mais cela nécessiterait de copier à nouveau l'ensemble du jeu de données. Y a-t-il une autre façon de faire cela?

105
Michael

Utilisez 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

De ?setcolorder:

Dans data.table le jargon, tout set* fonctions changent leur entrée par référence. C'est-à-dire qu'aucune copie n'est faite, à part la mémoire de travail temporaire, qui peut atteindre une colonne.

donc devrait être assez efficace. Voir ?setcolorder pour plus de détails.

164
Chase

On trouvera peut-être plus facile d’utiliser la solution ci-dessus, mais plutôt de trier par numéro de colonne. Par exemple: bibliothèque (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
8
Stephen