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 ?

0voto

Marcos Pontes Points 1

Vous pouvez utiliser l'incroyable paquet dplyr il existe une fonction appelée arrange. Il suffit de définir le cadre de données et les colonnes que vous voulez ordonner en tenant compte de la hiérarchie que vous avez choisie. La valeur par défaut est l'ordre ascendant, mais si vous voulez un ordre décroissant, utilisez la commande desc.

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"), header = TRUE)

library(dplyr)
arrange(rum,desc(I1),I2)

0voto

Rupesh Kumar Points 105

Colonne décroissante du cadre de données

df<- df[order(df$Differece, decreasing = TRUE),]

df<- df[order(df$Differece, decreasing = FALSE),]

0voto

Mikko Marttila Points 3262

En général, xtfrm() est la fonction générique permettant d'obtenir un tableau numérique qui trie comme le tableau d'entrée donné. Un tri décroissant peut alors être effectué en triant avec la valeur négative de xtfrm() . (C'est exactement la façon dont, par exemple dplyr desc() est mis en œuvre).

Par exemple, avec les données en question :

df <- read.table(text = "
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
", header = TRUE)

df[order(-xtfrm(df$I1), df$I2), ]
#>   P1 P2 P3 T1 T2 T3 I1 I2
#> 1  2  3  5 52 43 61  6  b
#> 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

Cette approche peut être généralisée dans une fonction R de base pour trier des cadres de données par des colonnes données, qui accepte également une valeur vectorielle decreasing argument. De ma réponse à cette question récente :

sortdf <- function(x, by = colnames(x), decreasing = FALSE) {
  x[do.call(order, Map(sortproxy, x[by], decreasing)), , drop = FALSE]
}

sortproxy <- function(x, decreasing = FALSE) {
  as.integer((-1)^as.logical(decreasing)) * xtfrm(x)
}

Et avec les données de l'exemple actuel, nous obtenons (bien sûr) :

sortdf(df, by = c("I1", "I2"), decreasing = c(TRUE, FALSE))
#>   P1 P2 P3 T1 T2 T3 I1 I2
#> 1  2  3  5 52 43 61  6  b
#> 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

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