Como reordenar colunas data.table (sem copiar)


118

Gostaria de reordenar as colunas no meu data.table x, dado um vetor de caracteres de nomes de coluna neworder:

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

Obviamente, eu poderia fazer:

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

mas isso exigiria copiar todo o conjunto de dados novamente. Há outra maneira de fazer isso?

Respostas:


183

Use 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:

Em data.tablelinguagem, todas as set*funções mudam sua entrada por referência. Ou seja, nenhuma cópia é feita, exceto a memória de trabalho temporária, que tem o tamanho de uma coluna.

então deve ser bastante eficiente. Veja ?setcolorderpara detalhes.


21
Pequeno esclarecimento: setcolordermove os ponteiros da coluna sem usar nenhuma memória de trabalho. Aquela frase sobre o uso de memória de trabalho com o tamanho de uma coluna é praticamente setkeyreal.
Matt Dowle,

2
@MatthewDowle - obrigado pelo esclarecimento. Eu meio que pensei que poderia ser o caso, mas não tinha 100% de certeza.
Chase

3
posso fazer isso para um subconjunto de colunas? Por exemplo, quando desejo apenas mover para as colunas da frente?
Peter Pan de

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

6
@PeterPan Veja também NEWS sobre a versão devel 1.10.5 : " setcolorder()agora aceita menos do que ncol(DT)colunas para serem movidas para a frente"
Henrik

12

Pode ser mais fácil usar a solução acima, mas em vez disso, classifique pelo número da coluna. Por exemplo: biblioteca (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
Geralmente é desencorajado referir-se a colunas por número, em data.table e em outros lugares. O data.table faq apresenta o argumento para isso no primeiro item aqui: datatable.r-forge.r-project.org/datatable-faq.pdf
Frank
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.