140 votes

Comment réorganiser les colonnes d'une table de données (sans les copier) ?

J'aimerais réorganiser les colonnes de mon site Web. data.table x , étant donné un vecteur de caractères des 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 le 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 des données. Existe-t-il un autre moyen de procéder ?

206voto

Chase Points 27342

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 :

En data.table Dans le langage courant, tout set* Les fonctions modifient leur entrée par référence. En d'autres termes, aucune copie n'est effectuée, à l'exception de la mémoire de travail temporaire, qui est aussi grande qu'une colonne.

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

19voto

Stephen Points 141

On peut trouver plus facile d'utiliser la solution ci-dessus, mais en triant plutôt par numéro de colonne. Par exemple : 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X