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.

  • (I.e. Principes de base de la fonction order() : La fonction order() renvoie les indices des lignes qui placent une colonne en ordre croissant, et non les valeurs triรฉes elles-mรชmes.
  • ๐Ÿ“Œ Colonne unique : df[order(df$c1), ] rรฉorganise chaque ligne du cadre selon les valeurs contenues dans c1.
  • ๐Ÿงฎ Plusieurs colonnes : Les arguments supplรฉmentaires servent de dรฉpartage, donc order(df$c3, df$c4) trie par c3 puis par c4.
  • ???? Ordre dรฉcroissant: Prรฉfixez une colonne numรฉrique par un signe moins, ou passez l'argument increasing = TRUE ร  sort().
  • ๐Ÿงฉ Route tidyverse : arrange() et desc() expriment exactement les mรชmes types que les verbes dplyr lisibles.
  • โš ๏ธ Valeurs manquantes : La fonction order() place par dรฉfaut les valeurs manquantes en dernier, tandis que la fonction sort() supprime les valeurs manquantes sauf si na.last est dรฉfini.

R Trier une trame de donnรฉes ร  l'aide de Order()

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 ยป.

FAQ

Utilisez `df[order(rownames(df)), ]`. Les noms de lignes รฉtant des caractรจres, le tri s'effectue selon le classement textuel et ยซ 10 ยป apparaรฎt avant ยซ 2 ยป. Encapsulez-les dans `as.numeric()` lorsqu'ils sont numรฉriques. Les tibbles ne contiennent pas les noms de lignes ; ajoutez donc une colonne d'identifiant explicite.

Utilisez l'option `method = โ€œradixโ€` avec `order()`, l'option la plus rapide pour les entiers et les chaรฎnes courtes. Pour des millions de lignes, `data.table::setorder()` trie directement sans copier le tableau, et la fonction `arrange()` de dplyr utilise dรฉjร  un tri par base en interne.

Indexez les donnรฉes en inversant l'ordre : `df[nrow(df):1, ]`. Cela inverse l'ordre actuel au lieu de le trier, ce qui est important lorsque le cadre a รฉtรฉ mรฉlangรฉ ou groupรฉ. Rรฉinitialisez ensuite les รฉtiquettes avec `rownames(df) <- NULL` si elles semblent confuses.

La colonne รฉtant stockรฉe au format caractรจre ou facteur, R la compare comme du texte et place ยซ 10 ยป avant ยซ 2 ยป. Vรฉrifiez la classe de la colonne (df$col), puis convertissez-la en numรฉrique (as.numeric(as.character(df$col))) avant de trier.

Non. La fonction `order()` renvoie un vecteur d'index et `df[order(โ€ฆ), ]` construit un nouveau cadre ; le cadre original reste donc intact jusqu'ร  ce que le rรฉsultat soit rรฉaffectรฉ. Les noms de lignes conservent leurs anciennes valeurs, ce qui indique que le cadre a รฉtรฉ rรฉorganisรฉ.

Les assistants IA peuvent dรฉtecter une colonne de type texte lorsqu'un tri numรฉrique semble incorrect, traduire un appel ร  la fonction `order()` de R en un pipeline dplyr et suggรฉrer une colonne de dรฉpartage fiable. Il est toujours recommandรฉ d'exรฉcuter le code et d'examiner le rรฉsultat de `head()` avant de se fier au rรฉsultat.

Oui. Copilote GitHub Fonctionne avec RStudio Desktop 2023.09.0 et versions ultรฉrieures et complรจte les appels aux fonctions `order()` et `arrange()` ร  partir d'un simple commentaire. Posit avertit que les suggestions ne sont pas dรฉterministes ; il est donc conseillรฉ de vรฉrifier chaque ligne avant exรฉcution.

Rรฉorganisez les colonnes plutรดt que les lignes. `df[, order(names(df))]` trie les colonnes par ordre alphabรฉtique, tandis que `df[, c("c3", "c1")]` spรฉcifie un ordre particulier. Les utilisateurs de dplyr peuvent appeler `select(df, c3, c1)`, qui rรฉorganise et sรฉlectionne des sous-ensembles en une seule รฉtape.

Rรฉsumez cet article avec :