57 votes

Comment ordonner un cadre de données par une colonne descendante et une colonne ascendante ?

J'ai un cadre de données, qui ressemble à ça :

    P1  P2  P3  T1  T2  T3  I1  I2
1   2   3   5   52  43  61  6   "b"
2   6   4   3   72  NA  59  1   "a"
3   1   5   6   55  48  60  6   "f"
4   2   4   4   65  64  58  2   "b"

Je veux le trier par I1 dans l'ordre décroissant, et les lignes ayant la même valeur dans I1 par I2 dans l'ordre croissant, en obtenant les lignes dans l'ordre suivant 1 3 4 2 . Mais le order semble ne prendre qu'un seul decreasing qui est ensuite TRUE ou FALSE pour tous les vecteurs d'ordre à la fois. Comment faire pour que mon tri soit correct ?

4voto

Pranay Aryal Points 2298
    library(dplyr)
    library(tidyr)
    #supposing you want to arrange column 'c' in descending order and 'd' in ascending order. name of data frame is df
    ## first doing descending
    df<-arrange(df,desc(c))
    ## then the ascending order of col 'd;
    df <-arrange(df,d)

3voto

Rick Points 848

Le tri par défaut est stable, donc nous trions deux fois : d'abord par la clé mineure, puis par la clé majeure.

rum1 <- rum[order(rum$I2, decreasing = FALSE),]
rum2 <- rum1[order(rum1$I1, decreasing = TRUE),]

1voto

Dmitri B Points 76
rum[order(rum$T1, -rum$T2 ), ]

0voto

dinh Points 65

Le bon chemin est :

rum[order(rum$T1, rum$T2, decreasing=c(T,F)), ]

0voto

Dans l'exemple de @dudusan, vous pourriez également inverser l'ordre de I1, puis effectuer un tri ascendant :

> rum <- read.table(textConnection("P1  P2  P3  T1  T2  T3  I1  I2
+   2   3   5   52  43  61  6   b
+   6   4   3   72  NA  59  1   a
+   1   5   6   55  48  60  6   f
+   2   4   4   65  64  58  2   b
+   1   5   6   55  48  60  6   c"), header = TRUE)
> f=factor(rum$I1)   
> levels(f) <- sort(levels(f), decreasing = TRUE)
> rum[order(as.character(f), rum$I2), ]
  P1 P2 P3 T1 T2 T3 I1 I2
1  2  3  5 52 43 61  6  b
5  1  5  6 55 48 60  6  c
3  1  5  6 55 48 60  6  f
4  2  4  4 65 64 58  2  b
2  6  4  3 72 NA 59  1  a
> 

Cela semble un peu plus court, on n'inverse pas deux fois l'ordre de I2.

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