R Sort DataFrame : fonction order() avec exemple
โก Rรฉsumรฉ intelligent
Le tri d'un data frame en R s'appuie sur la fonction `order()`, qui renvoie les positions des lignes plutรดt que leurs valeurs. En passant ces positions entre crochets, on rรฉorganise les lignes selon une colonne, plusieurs colonnes ou par ordre dรฉcroissant.

Trier des donnรฉes dans R
Dans l'analyse des donnรฉes, vous pouvez sort vos donnรฉes en fonction d'une certaine variable dans l'ensemble de donnรฉes. En R, on peut utiliser lโaide de la fonction order(). En R, on peut facilement trier un vecteur de variable continue ou de variable factorielle. L'organisation des donnรฉes peut รชtre de ascendant or descendant ordre.
syntaxe:
sort(x, decreasing = FALSE, na.last = NA)
Dispute:
- x: Un vecteur contenant une variable continue ou catรฉgorielle
- rรฉductionContrรดle le sens du tri. Par dรฉfaut, le tri dรฉcroissant est dรฉsactivรฉ (FALSE), ce qui donne un tri croissant.
- na.dernier: Indique si les valeurs manquantes doivent รชtre placรฉes en dernier. Par dรฉfaut, `sort()` utilise `NA`, ce qui supprime les valeurs manquantes ; `order()` utilise `TRUE`, ce qui les conserve et les place en dernier.
sort() vs order() vs rank() en R
La syntaxe ci-dessus correspond ร la fonction `sort()`, pourtant tous les exemples de cette page utilisent `order()`. Ces deux fonctions rรฉpondent ร des besoins diffรฉrents, et les confondre est la cause la plus frรฉquente d'รฉchec apparent d'un tri. La fonction `rank()` complรจte le trio.
| Fonction | Retours de produits | Utilisez-le quand | Gestion par dรฉfaut des NA |
|---|---|---|---|
| sorte() | Les valeurs elles-mรชmes, dans l'ordre | Vous n'avez besoin que d'un vecteur triรฉ | na.last = NA, donc NA est supprimรฉ |
| commande() | Les positions des lignes qui produisent l'ordre triรฉ | Vous devez rรฉorganiser un cadre de donnรฉes entier | na.last = TRUE, donc NA est placรฉ en dernier. |
| rang() | Le rang de chaque รฉlรฉment dans sa position d'origine | Il vous faut une colonne de classement, pas un tableau rรฉorganisรฉ | na.last = VRAI |
Puisque la fonction order() renvoie des positions, c'est la seule des trois qui peut permettre le sous-ensemble entre crochets utilisรฉ tout au long de cette page. Documentation de base R pour order() liste tous les arguments, y compris l'argument de mรฉthode qui sรฉlectionne l'algorithme de tri.
Exemple 1 : Trier un DataFrame selon une colonne
Par exemple, nous pouvons crรฉer un dataframe tibble et trier une ou plusieurs variables. Un dataframe tibble est une version moderne du trame de donnรฉesCela amรฉliore la syntaxe des data frames et รฉvite les problรจmes de formatage des types de donnรฉes, notamment la conversion des caractรจres en facteurs. C'est รฉgalement un moyen pratique de crรฉer un data frame manuellement, ce qui est notre objectif ici. Pour en savoir plus sur tibble, veuillez consulter la documentation : https://tibble.tidyverse.org/articles/tibble.html
Le code ci-dessous construit un tibble de 50 lignes de cinq colonnes alรฉatoires, puis trie chaque ligne selon les valeurs de c1. set.seed(1234) fixe le tirage alรฉatoire, de sorte que les mรชmes nombres apparaissent sur n'importe quelle machine.
library(dplyr) set.seed(1234) data_frame <- tibble( c1 = rnorm(50, 5, 1.5), c2 = rnorm(50, 5, 1.5), c3 = rnorm(50, 5, 1.5), c4 = rnorm(50, 5, 1.5), c5 = rnorm(50, 5, 1.5) ) # Sort by c1 df <-data_frame[order(data_frame$c1),] head(df)
Sortie :
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1.481453 3.477557 4.246283 3.686611 6.0511003 ## 2 1.729941 5.824996 4.525823 6.753663 0.1502718 ## 3 2.556360 6.275348 2.524849 6.368483 5.4787404 ## 4 2.827693 4.769902 5.120089 3.743626 4.0103449 ## 5 2.988510 4.395902 2.077631 4.236894 4.6176880 ## 6 3.122021 6.317305 5.413840 3.551145 5.6067027
La virgule avant la parenthรจse fermante est importante : df[order(โฆ), ] rรฉorganise les lignes, tandis que df[, order(โฆ)] rรฉorganiserait plutรดt les colonnes.
Exemple 2 : Trier selon plusieurs colonnes
Chaque argument supplรฉmentaire passรฉ ร order() sert de critรจre de dรฉpartage pour l'argument prรฉcรฉdent. Ici, le cadre est triรฉ selon c3, puis les lignes partageant la mรชme valeur de c3 sont triรฉes selon c4.
# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)
Sortie :
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 2.988510 4.395902 2.077631 4.236894 4.617688 ## 2 2.556360 6.275348 2.524849 6.368483 5.478740 ## 3 3.464516 3.914627 2.730068 9.565649 6.016123 ## 4 4.233486 3.292088 3.133568 7.517309 4.772395 ## 5 3.935840 2.941547 3.242078 6.464048 3.599745 ## 6 3.835619 4.947859 3.335349 4.378370 7.240240
Exemple 3 : Trier une colonne par ordre dรฉcroissant et une autre par ordre croissant
Chaque colonne peut avoir son propre sens de tri. Prรฉfixer une colonne numรฉrique par un signe moins inverse uniquement cette colonne ; ainsi, le tri ci-dessous sโeffectue par ordre dรฉcroissant pour c3 et par ordre croissant pour c4.
# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)
Sortie :
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 4.339178 4.450214 8.087243 4.5010140 8.410225 ## 2 3.959420 8.105406 7.736312 7.1168936 5.431565 ## 3 3.339023 3.298088 7.494285 5.9303153 7.035912 ## 4 3.397036 5.382794 7.092722 0.7163620 5.620098 ## 5 6.653446 4.733315 6.520536 0.9016707 4.513410 ## 6 4.558559 4.712609 6.380086 6.0562703 5.044277
L'astuce du signe moins ne fonctionne que pour les colonnes numรฉriques. Pour les colonnes de type caractรจre ou facteur, utilisez `order(xtfrm(df$col), decrease = TRUE)` ou passez ร la mรฉthode dplyr prรฉsentรฉe ci-aprรจs.
Trier un DataFrame avec dplyr arrange()
L'utilisation des crochets devient difficile ร lire dรจs lors qu'il y a plusieurs colonnes et instructions, car le nom du cadre est rรฉpรฉtรฉ ร l'intรฉrieur de chaque argument. dรฉplyr La fonction `arrange()` supprime cette rรฉpรฉtition : les colonnes sont nommรฉes une seule fois, et `desc()` marque celles qui sont disposรฉes ร lโenvers.
library(dplyr) # The same three sorts written with arrange() data_frame %>% arrange(c1) # Example 1 data_frame %>% arrange(c3, c4) # Example 2 data_frame %>% arrange(desc(c3), c4) # Example 3
Il est utile de connaรฎtre trois diffรฉrences pratiques :
- lisibilitรฉ: arrange(desc(c3), c4) indique directement l'intention, tandis que order(-data_frame$c3, data_frame$c4) la cache derriรจre un signe moins.
- Types de colonnes: desc() fonctionne sur les colonnes de caractรจres et de facteurs ainsi que sur les colonnes numรฉriques, donc aucune solution de contournement xtfrm() n'est nรฉcessaire.
- Valeurs manquantes: arrange() place toujours NA en dernier, quelle que soit la direction, tandis que order() vous permet de les dรฉplacer avec na.last.
La fonction `arrange()` renvoie un nouveau cadre de donnรฉes sans modifier l'original, exactement comme avec les crochets. Il faut donc nommer le rรฉsultat pour le conserver. Les cadres groupรฉs sont triรฉs au sein de chaque groupe uniquement si `.by_group = TRUE` est spรฉcifiรฉ.
Tri des caractรจres, des facteurs et des valeurs manquantes dans R
Les colonnes numรฉriques se trient de maniรจre prรฉvisible. Ce n'est pas le cas pour le texte, les catรฉgories et les espaces, et chacun de ces trois types nรฉcessite une dรฉcision diffรฉrente.
Valeurs manquantes. Les fonctions sort() et order() divergent quant ร la maniรจre de gรฉrer les valeurs NA, ce qui explique pourquoi une mรชme colonne peut produire deux nombres de lignes diffรฉrents :
x <- c(3, NA, 1, 2) sort(x) # missing values dropped sort(x, na.last = TRUE) # missing values pushed to the end order(x) # NA indexed last by default order(x, na.last = FALSE) # NA indexed first
Facteurs. A facteur Le tri s'effectue par niveau, et non par ordre alphabรฉtique. C'est prรฉcisรฉment ce que vous souhaitez pour les catรฉgories ordonnรฉes telles que faible, moyen et รฉlevรฉ, et prรฉcisรฉment ce que vous ne souhaitez pas si les niveaux ont รฉtรฉ crรฉรฉs dans l'ordre d'apparition des valeurs.
grades <- factor(c("low", "high", "medium"), levels = c("low", "medium", "high")) sort(grades) # follows the level order sort(as.character(grades)) # plain alphabetical order
Colonnes de caractรจres. Le tri du texte brut s'effectue selon le classement rรฉgional ; par consรฉquent, la casse et les accents peuvent influencer le rรฉsultat d'une machine ร l'autre. Deux bonnes pratiques permettent d'รฉviter les surprises : vรฉrifier la classe `df$col` avant le tri et convertir les chiffres stockรฉs sous forme de texte avec `as.numeric()` afin que ยซ 10 ยป ne prรฉcรฉdera pas ยซ 2 ยป.
