web-dev-qa-db-fra.com

Trier les colonnes d'un dataframe par nom de colonne

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 ordonner les colonnes par noms de colonne par ordre alphabétique, pour atteindre 

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

Pour d'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 jeux de données sont énormes, avec 10000 variables. Le processus doit donc être plus automatisé.

61
John Clark

Vous pouvez utiliser order sur la names et l'utiliser pour ordonner les colonnes lors de la sous-définition:

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 correspondance des noms avec l'ordre. Cela dépendra de la façon dont vous voudriez le faire, mais échanger la fonction que vous voulez avec ceci avec order ci-dessus devrait donner la sortie désirée.

Vous pouvez par exemple consulter Ordonnez les lignes d'un bloc de données en fonction d'un vecteur cible spécifiant l'ordre souhaité , c'est-à-dire que vous pouvez match votre cadre de données names par rapport à un vecteur cible contenant l'ordre des colonnes souhaité.

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

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

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

pour les autres:

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

Voici la réponse dplyr obligatoire au cas où quelqu'un voudrait le faire avec le tuyau.

test %>% 
    select(sort(names(.)))
5
Andrew Brēza
  test[,sort(names(test))]

trier sur les noms de colonnes peut fonctionner facilement.

2
Shalini Baranwal

Si vous voulez seulement une ou plusieurs colonnes à l'avant et ne vous souciez pas de l'ordre des autres:

require(dplyr)
test %>%
  select(B, everything())
0
Xavier Jiménez

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

Tout d’abord, faites ce que James a mentionné ci-dessus, c’est-à-dire.

test[ , order(names(test))]

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

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

Le plus grand centre commercial

0
Brit

Une autre option consiste à utiliser str_sort() à partir de la bibliothèque stringr , avec l'argument numeric = TRUE.

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

# [1] V1 V3 V11

0
demarsylvain

Semblable à une autre syntaxe ci-dessus mais pour apprendre - pouvez-vous trier par noms de colonnes?

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

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

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]
0
Tom Wagstaff