371 votes

Comment réorganiser les colonnes dans un cadre de données?

Comment changer cette entrée (avec la séquence : temps, entrée, sortie, fichiers) :

Temps Entrée Sortie Fichiers
1     2      3      4
2     3      4      5

Par cette sortie (avec la séquence : temps, sortie, entrée, fichiers) :

Temps Sortie Entrée Fichiers
1     3      2      4
2     4      3      5

Voici les données fictives en R :

table <- data.frame(Temps=c(1,2), Entrée=c(2,3), Sortie=c(3,4), Fichiers=c(4,5))
table
##  Temps Entrée Sortie Fichiers
##1    1     2     3      4
##2    2     3     4      5

4 votes

help(Extract) aussi connu sous le nom de ?'['

3 votes

En plus de la suggestion de @Joris, essayez de lire les sections 2.7 et 5 du manuel "An Introduction to R" : cran.r-project.org/doc/manuals/R-intro.html

5 votes

Un problème supplémentaire : toutes les réponses nécessitent la liste complète des colonnes, sinon cela aboutit à un sous-ensemble. Et si nous voulons seulement énumérer quelques colonnes à classer en premier, mais aussi conserver toutes les autres ?

396voto

richiemorrisroe Points 2448

Votre dataframe a quatre colonnes comme ceci df[,c(1,2,3,4)]. Notez que la première virgule signifie de garder toutes les lignes, et les chiffres 1,2,3,4 se réfèrent aux colonnes.

Pour changer l'ordre comme dans la question ci-dessus, faites df2[,c(1,3,2,4)]

Si vous souhaitez exporter ce fichier en tant que csv, faites write.csv(df2, file="somedf.csv")

41 votes

Il est bon lorsque vous avez un nombre limité de colonnes, mais que se passe-t-il si vous avez par exemple 50 colonnes, cela prendrait trop de temps pour taper tous les numéros ou noms de colonnes. Quelle serait une solution plus rapide?

65 votes

@user4050: dans ce cas, vous pouvez utiliser la syntaxe ":" , par exemple. df[,c(1,3,2,4,5:50)].

1 votes

Pour mettre les colonnes dans idcols au début : idcols <- c("name", "id2", "start", "duration"); cols <- c(idcols, names(cts)[-which(names(cts) %in% idcols)]); df <- df[cols]

196voto

Xavier Guardiola Points 628
# réorganiser par nom de colonne
data <- data[, c("A", "B", "C")] # laisser l'index de la ligne vide pour garder toutes les lignes

# réorganiser par indice de colonne
data <- data[, c(1,3,2)] # laisser l'index de la ligne vide pour garder toutes les lignes

1 votes

Question en tant que débutant, pouvez-vous combiner le classement par index et par nom? Par exemple, data <- data[c(1,3,"Var1", 2)]?

7 votes

@BramVanroy non, c(1,3,"Var1", 2) sera lu comme c("1","3","Var1", "2") car les vecteurs ne peuvent contenir des données que d'un seul type, donc les types sont promus au type le plus général présent. Comme il n'y a pas de colonnes avec les noms character "1", "3", etc. vous obtiendrez des "colonnes non définies". list(1,3,"Var1", 2) garde les valeurs sans promotion de type, mais vous ne pouvez pas utiliser une list dans le contexte ci-dessus.

2 votes

Pourquoi la découpe mtcars[c(1,3,2)] fonctionne-t-elle ? Je m'attendais à une erreur liée à des dimensions incorrectes ou similaires... Ne devrait-elle pas être mtcars[,c(1,3,2)] ?

122voto

dalloliogm Points 2628

Vous pouvez également utiliser la fonction de sous-ensemble :

data <- subset(data, select=c(3,2,1))

Il vaut mieux utiliser l'opérateur [] comme dans les autres réponses, mais il peut être utile de savoir que vous pouvez effectuer une opération de sous-ensemble et de réorganisation de colonnes en une seule commande.

Mise à jour :

Vous pouvez également utiliser la fonction select du package dplyr :

data = data %>% select(Time, out, In, Files)

Je ne suis pas sûr de l'efficacité, mais grâce à la syntaxe de dplyr, cette solution devrait être plus flexible, notamment si vous avez beaucoup de colonnes. Par exemple, ce qui suit va réorganiser les colonnes de l'ensemble de données mtcars dans l'ordre opposé :

mtcars %>% select(carb:mpg)

Et ce qui suit ne réorganisera que certaines colonnes et en éliminera d'autres :

mtcars %>% select(mpg:disp, hp, wt, gear:qsec, starts_with('carb'))

En savoir plus sur la syntaxe select de dplyr.

6 votes

Il y a quelques raisons de ne pas utiliser subset(), consultez cette question.

2 votes

Merci. Dans tous les cas, j'utiliserais maintenant la fonction select du package dplyr, plutôt que subset.

108 votes

Lorsque vous souhaitez déplacer une paire de colonnes vers la gauche sans en supprimer les autres, je trouve everything() particulièrement génial; mtcars %>% select(wt, gear, everything())

3voto

rahul Points 1
C <- datafile[, c(1,3,2,4:10)]

c est un nouveau nom de variable, vous pouvez donner n'importe quel nom de variable ... datafile est la table / le fichier contenant les colonnes

0voto

user2420958 Points 1

Une autre façon de résoudre ce problème consiste à créer une variante factorielle et à mettre l'ordre de ces membres de facteur, puis cela sera très utile comme vous pourriez vous y attendre comme ci-dessous.

> table = data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
> table

   Time In Out Files
 1    1  2   3     4
 2    2  3   4     5

> cn = factor(c('Time', 'In', 'Out', 'Files'), levels=c(c('Time', 'Out', 'In', 'Files')), ordered=T)

> table[cn]

   Time Out In Files
 1    1   3  2     4
 2    2   4  3     5

Pour surprendre, cela fonctionne également comme ci-dessous, veuillez noter le changement des lignes dans ko.d.m après la fonction d'agrégation. Pourquoi cela semble intéressant? Cela aide à mettre le contrôle, le groupe important dans les premières colonnes surtout lorsqu'il est présenté avec un graphique.

 > ko.d
   bcd452 livece452 grcd452 maccd452 tcd452
 6  0.1970     0.911   0.000   0.2940   2.34
 7  0.0437     1.410   0.000   0.0801   4.72
 8  0.1450     4.530   0.000   0.3160   9.86
 9  0.1920     3.690   0.495   0.5130   5.43
 10 0.2060     4.080   0.000   0.1610   5.87
 11 0.0000     3.180   0.000   0.0911   6.85
 12 0.1200     4.430   0.000   1.1900   7.51
 > gt = c('ko', 'ko', 'wt', 'wt', 'wt', 'wt', 'wt')
 > ko.d.m = aggregate(ko.d, by=list(gt=gt), mean)
 > ko.d.m
   gt  bcd452 livece452 grcd452 maccd452 tcd452
 1 ko 0.12035    1.1605   0.000  0.18705  3.530
 2 wt 0.13260    3.9820   0.099  0.45422  7.104
 > 
 > gt = factor(c('ko', 'ko', 'wt', 'wt', 'wt', 'wt', 'wt'), levels=c('wt', 'ko'), ordered=T)
 > ko.d.m = aggregate(ko.d, by=list(gt=gt), mean)
 > ko.d.m
   gt  bcd452 livece452 grcd452 maccd452 tcd452
 1 wt 0.13260    3.9820   0.099  0.45422  7.104
 2 ko 0.12035    1.1605   0.000  0.18705  3.530

Je viens de réaliser que cela pourrait être hors de la question d'origine. C'est plus comme réorganiser les lignes après le calcul. Quoi qu'il en soit, je le laisserai ici car il est lié à la réorganisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X