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é.

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é.


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(.)))

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")]


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())

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")))]

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


1

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

sort(colnames(test[1:ncol(test)] ))

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())

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.