371 votes

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

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

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

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

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

Voici les données R factices :

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

4 votes

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

3 votes

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

5 votes

Un problème supplémentaire : toutes les réponses nécessitent la liste complète des colonnes, sinon elles entraînent un sous-ensemble. Qu'en est-il si nous voulons seulement lister quelques colonnes à ordonner comme les premières, tout en conservant toutes les autres ?

396voto

richiemorrisroe Points 2448

Votre cadre de données comporte quatre colonnes, comme suit df[,c(1,2,3,4)] . Notez que la première virgule signifie qu'il faut garder toutes les lignes, et que les 1,2,3,4 font référence aux colonnes.

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

Si vous voulez sortir ce fichier comme un csv, faites write.csv(df2, file="somedf.csv")

41 votes

Cela convient lorsque vous avez un nombre limité de colonnes, mais si vous avez par exemple 50 colonnes, cela prendrait trop de temps de taper tous les numéros ou noms de colonnes. Quelle serait la solution la 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
# reorder by column name
data <- data[c("A", "B", "C")]

#reorder by column index
data <- data[c(1,3,2)]

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 nope, c(1,3,"Var1", 2) sera lu comme c("1","3","Var1", "2") parce que les vecteurs ne peuvent contenir que des données d'un seul type, les types sont donc promus au type le plus général présent. Parce qu'il n'y a pas de colonnes avec le type caractère les noms "1", "3", etc., vous obtiendrez "colonnes non définies". list(1,3,"Var1", 2) conserve les valeurs sans promotion de type, mais vous ne pouvez pas utiliser une fonction list dans le contexte ci-dessus.

2 votes

Pourquoi le mtcars[c(1,3,2)] le travail de sous-ensemble ? Je me serais attendu à une erreur liée à des dimensions incorrectes ou autre... Cela ne devrait-il 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 est préférable d'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 colonne en une seule commande.

Mise à jour :

Vous pouvez également utiliser la fonction select du paquet 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, surtout si vous avez beaucoup de colonnes. Par exemple, ce qui suit réordonnera les colonnes de l'ensemble de données mtcars dans l'ordre inverse :

mtcars %>% select(carb:mpg)

Et ce qui suit réorganisera seulement certaines colonnes, et en supprimera d'autres :

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

Plus d'informations sur La syntaxe select de dplyr .

6 votes

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

2 votes

Merci. En tout cas, j'utiliserais maintenant la fonction select du paquet dplyr, au lieu de subset.

108 votes

Lorsque vous voulez amener quelques colonnes sur le côté gauche et ne pas faire tomber les autres, je trouve que 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 un nom à n'importe quelle variable ... datafile est le tableau/fichier contenant les colonnes

0voto

user2420958 Points 1

Une autre façon de comprendre cela est de faire une variante factorielle, et de mettre l'ordre pour ces membres du facteur, alors il sera très utile comme vous pouvez 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

A la surprise générale, cela fonctionne également comme ci-dessous, veuillez noter le changement des lignes dans le ko.d.m après la fonction d'agrégation. Pourquoi cela semble-t-il intéressant ? Cela permet de placer le groupe de contrôle, le groupe important, dans les premières colonnes, surtout lorsqu'on présente 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 n'a peut-être rien à voir avec la question initiale. Il s'agit plutôt de réorganiser les lignes après le calcul. Quoi qu'il en soit, je vais quand même laisser cette question ici puisqu'elle est liée à 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