Classificar colunas de um dataframe por nome de coluna

96

Esta é possivelmente uma pergunta simples, mas não sei como ordenar as colunas em ordem alfabética.

test = data.frame(C = c(0, 2, 4, 7, 8), A = c(4, 2, 4, 7, 8), B = c(1, 3, 8, 3, 2))

#   C A B
# 1 0 4 1
# 2 2 2 3
# 3 4 4 8
# 4 7 7 3
# 5 8 8 2

Eu gosto de ordenar as colunas por nomes de coluna em ordem alfabética, para alcançar

#   A B C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Para outros, quero meu próprio pedido definido:

#   B A C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Observe que meus conjuntos de dados são enormes, com 10.000 variáveis. Portanto, o processo precisa ser mais automatizado.

John Clark
fonte

Respostas:

139

Você pode usar orderno namese para ordenar as colunas ao definir os subconjuntos:

test[ , order(names(test))]
  A B C
1 4 1 0
2 2 3 2
3 4 8 4
4 7 3 7
5 8 2 8

Para seu próprio pedido definido, você precisará definir seu próprio mapeamento dos nomes para o pedido. Isso dependeria de como você gostaria de fazer isso, mas trocar qualquer função por esta com a orderacima deve fornecer a saída desejada.

Você pode, por exemplo, dar uma olhada em Ordenar as linhas de um quadro de dados de acordo com um vetor de destino que especifica a ordem desejada , ou seja, você pode matchseu quadro de dados namescontra um vetor de destino contendo a ordem de coluna desejada.

James
fonte
3
Para elaborar, teste [, c (2,3,1)] ou teste [, c ('A', 'B', 'C')] irá produzir A, B, C ordem das colunas. O operador "[" é muito inteligente em descobrir o que você deseja fazer.
Carl Witthoft,
2
obrigado, descobri a segunda questão com a ajuda fornecida; minha ordem = c ("B", "A", "C"), teste [, minha ordem]
John Clark
Existe uma maneira de classificar as colunas da maneira que eu quiser (digamos CAB)?
TYZ
Você pode tirar proveito do fato de que um data.frame é uma lista e torná-lo mais simples :: test[ order(names(test)) ]
ctbrown
1
@naco Nenhum, leia a fonte de colnames: acaba chamando namespor a data.frame.
James
27

Aqui está a dplyrresposta obrigatória caso alguém queira fazer isso com o cachimbo.

test %>% 
    select(sort(names(.)))
Andrew Brēza
fonte
4
Para mim, funcionou bem, pois é fácil selecionar as variáveis ​​que desejo primeiro. Seguindo o df original: test%>%select(b,sort(names(.)))será colocado como "b, a, c"
Silentdevildoll
@Silentdevildoll que é um aplicativo legal! Eu não pensei nisso.
Andrew Brēza 01 de
14
test = data.frame(C=c(0,2,4, 7, 8), A=c(4,2,4, 7, 8), B=c(1, 3, 8,3,2))

Usando a seguinte substituição de função simples pode ser realizada (mas apenas se o quadro de dados não tiver muitas colunas):

test <- test[, c("A", "B", "C")]

para os outros:

test <- test[, c("B", "A", "C")]
MANOJ KUMAR
fonte
6
  test[,sort(names(test))]

classificar em nomes de colunas pode funcionar facilmente.

Shalini Baranwal
fonte
5

Se você deseja apenas uma ou mais colunas na frente e não se importa com a ordem das demais:

require(dplyr)
test %>%
  select(B, everything())
Xavier Jiménez Albán
fonte
2

Então, para que uma coluna específica venha primeiro, depois o resto em ordem alfabética, eu proporia esta solução:

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]
Tom Wagstaff
fonte
e se você quiser que mais de uma coluna seja a primeira, o que fazer?
Maksym Moroz de
2

Uma opção alternativa é usar str_sort()from library stringr , com o argumento numeric = TRUE. Isso ordenará corretamente as colunas que incluem números não apenas em ordem alfabética :

str_sort(c("V3", "V1", "V10"), numeric = TRUE)

# [1] V1 V3 V11

Demarsylvain
fonte
1

Semelhante a outra sintaxe acima, mas para aprendizado - você pode classificar por nomes de coluna?

sort(colnames(test[1:ncol(test)] ))
KNN
fonte
O [1:ncol(test)]não está fazendo nada aqui, é apenas uma maneira mais longa de escrever sort(colnames(test)).
Gregor Thomas
0

Aqui está o que descobri para resolver um problema semelhante com meu conjunto de dados.

Primeiro, faça o que James mencionou acima, ou seja,

test[ , order(names(test))]

Em segundo lugar, use a função everything () em dplyr para mover colunas específicas de interesse (por exemplo, "D", "G", "K") no início do quadro de dados, colocando as colunas ordenadas alfabeticamente após essas.

select(test, D, G, K, everything())

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Brit
fonte