Trier les colonnes d'un dataframe par nom de colonne

93

C'est peut-être une question simple, mais je ne sais pas comment classer les colonnes par ordre alphabétique.

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

J'aime classer les colonnes par nom de colonne par ordre alphabétique, pour obtenir

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

Pour les autres, je veux mon propre ordre défini:

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

Veuillez noter que mes ensembles de données sont énormes, avec 10000 variables. Le processus doit donc être plus automatisé.

John Clark
la source

Réponses:

137

Vous pouvez utiliser ordersur le names, et l'utiliser pour trier les colonnes lors du sous-ensemble:

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

Pour votre propre ordre défini, vous devrez définir votre propre mappage des noms à l'ordre. Cela dépendra de la façon dont vous souhaitez faire cela, mais le remplacement de la fonction ci- orderdessus devrait donner le résultat souhaité.

Vous pouvez par exemple jeter un œil à Ordonner les lignes d'un bloc de données selon un vecteur cible qui spécifie l'ordre souhaité , c'est-à-dire que vous pouvez comparer matchvotre bloc de données namesà un vecteur cible contenant l'ordre des colonnes souhaité.

James
la source
3
Pour élaborer, test [, c (2,3,1)] ou test [, c ('A', 'B', 'C')] produira l'ordre des colonnes A, B, C. L'opérateur "[" est très intelligent pour déterminer ce que vous voulez faire.
Carl Witthoft
2
merci, j'ai compris la deuxième question avec l'aide fournie; myorder = c ("B", "A", "C"), test [, myorder]
John Clark
Existe-t-il un moyen de trier les colonnes de la manière que je veux (disons CAB)?
TYZ
Vous pouvez profiter du fait qu'un data.frame est une liste et le rendre plus simple :: test[ order(names(test)) ]
ctbrown
1
@naco None, lisez la source de colnames: il finit par appeler namesun fichier data.frame.
James
27

Voici la dplyrréponse obligatoire au cas où quelqu'un voudrait faire cela avec la pipe.

test %>% 
    select(sort(names(.)))
Andrew Brēza
la source
4
Pour moi, cela a bien fonctionné car il est facile de sélectionner les variables que je veux en premier. Rester fidèle au df original: test%>%select(b,sort(names(.)))le mettra comme "b, a, c"
Silentdevildoll
@Silentdevildoll c'est une application cool! Je n'y ai pas pensé.
Andrew Brēza
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))

En utilisant la simple fonction suivante, le remplacement peut être effectué (mais uniquement si la trame de données n'a pas beaucoup de colonnes):

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

pour les autres:

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

le tri sur les noms de colonnes peut fonctionner facilement.

Shalini Baranwal
la source
4

Si vous ne voulez qu'une ou plusieurs colonnes à l'avant et que vous ne vous souciez pas de l'ordre du reste:

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

Donc, pour avoir une colonne spécifique en premier, puis le reste par ordre alphabétique, je propose cette solution:

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]
Tom Wagstaff
la source
et si vous voulez que plus d'une colonne soit la première, alors quoi?
Maksym Moroz
2

Une autre option consiste à utiliser à str_sort()partir de la bibliothèque stringr , avec l'argument numeric = TRUE. Cela ordonnera correctement les colonnes qui incluent des nombres non seulement par ordre alphabétique :

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

# [1] V1 V3 V11

demarsylvain
la source
1

Similaire à l'autre syntaxe ci-dessus mais pour l'apprentissage - pouvez-vous trier par noms de colonnes?

sort(colnames(test[1:ncol(test)] ))
KNN
la source
Le [1:ncol(test)]ne fait rien ici, c'est juste une façon plus longue d'écrire sort(colnames(test)).
Gregor Thomas
0

Voici ce que j'ai découvert pour résoudre un problème similaire avec mon ensemble de données.

Tout d'abord, faites ce que James a mentionné ci-dessus, à savoir

test[ , order(names(test))]

Deuxièmement, utilisez la fonction tout () dans dplyr pour déplacer des colonnes spécifiques d'intérêt (par exemple, "D", "G", "K") au début de la trame de données, en plaçant les colonnes par ordre alphabétique après celles-ci.

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

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

Brit
la source