5 votes

Trier les données en R

J'ai un data frame avec 900 000 lignes et 11 colonnes en R. Les noms et types des colonnes sont les suivants :

Nom de la colonne: date / mcode / mname / ycode / yname / yissue  / bsent   / breturn / tsent   / treturn / csales
type:        Date / Char  / Char  / Char  / Char  / Numeric / Numeric / Numeric / Numeric / Numeric / Numeric

Je veux trier les données par ces variables dans l'ordre suivant :

  1. date
  2. mcode
  3. ycode
  4. yissue

L'ordre des niveaux est important ici, c'est-à-dire qu'ils doivent être triés par date d'abord, et s'il y a des dates identiques, ils doivent être triés par mcode, et ainsi de suite. Comment puis-je faire cela en R ?

11voto

jbremnant Points 394

Peut-être quelque chose comme ça?

> df<- data.frame(a=rev(1:10), b=rep(c(2,1),5), c=rnorm(10))
> df
    a b           c
1  10 2 -0.85212079
2   9 1 -0.46199463
3   8 2 -1.52374565
4   7 1  0.28904717
5   6 2 -0.91609012
6   5 1  1.60448783
7   4 2  0.51249796
8   3 1 -1.35119089
9   2 2 -0.55497745
10  1 1 -0.05723538
> with(df, df[order(a, b, c), ])
    a b           c
10  1 1 -0.05723538
9   2 2 -0.55497745
8   3 1 -1.35119089
7   4 2  0.51249796
6   5 1  1.60448783
5   6 2 -0.91609012
4   7 1  0.28904717
3   8 2 -1.52374565
2   9 1 -0.46199463
1  10 2 -0.85212079

La fonction "order" peut prendre plusieurs vecteurs comme arguments.

8voto

Ramnath Points 24798

En s'appuyant sur la solution précédente, voici deux autres approches. La deuxième approche nécessite plyr.

df.sorted = df[do.call(order, df[names(df)]),];
df.sorted = arrange(df, a, b, c)

4voto

JD Long Points 20477

Si aucune des réponses ci-dessus ne vous convainc, vous pouvez toujours utiliser la fonction orderBy() du package doBy :

require(doBy)
sortedData <- orderBy(~date+mcode+ycode+yissue , data=unsortedData)

Comme vous pouvez vous y attendre intuitivement, vous pouvez mettre un signe négatif devant n'importe quelle variable pour la trier par ordre décroissant.

orderBy() n'a rien de magique. Comme le précise la documentation, il s'agit d'un "enrobage pour la fonction order() - la différence importante étant que les variables à trier peuvent être données par une formule de modèle."

Je trouve la syntaxe plus facile à retenir.

1voto

Tomsim Points 11

Notes supplémentaires: utilisez -c() pour inverser le tri des colonnes de facteur ou de caractère

with(df, df[order(a, b, -c(myCharCol)), ])

Vous pouvez également ajouter un vecteur pour sélectionner uniquement certaines colonnes

with(df, df[order(a, b, c), c('a','b','x','y')])

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