• # R

    Posté par . En réponse au journal Cohérence des fonctions de tri. Évalué à 2.

    Et vous, vous feriez vous avoir ? Comment votre outil gère-t-il ce cas ?

    Ici, c'est du R. La fonction de base qui gère pareils cas est nommée rank. Sa documentation, help(rank), dit partiellement ceci :

    Description:

     Returns the sample ranks of the values in a vector. Ties (i.e.,
     equal values) and missing values can be handled in several ways.
    

    Usage:

     rank(x, na.last = TRUE,
     ties.method = c("average", "first", "last", "random", "max", "min"))
    

    Arguments:

     x: a numeric, complex, character or logical vector.
     na.last: for controlling the treatment of ‘NA’s. If ‘TRUE’, missing
     values in the data are put last; if ‘FALSE’, they are put
     first; if ‘NA’, they are removed; if ‘"keep"’ they are kept
     with rank ‘NA’.
     ties.method: a character string specifying how ties are treated, see
     ‘Details’; can be abbreviated.
    

    Details:

     If all components are different (and no ‘NA’s), the ranks are well
     defined, with values in ‘seq_along(x)’. With some values equal
     (called ‘ties’), the argument ‘ties.method’ determines the result
     at the corresponding indices. The ‘"first"’ method results in a
     permutation with increasing values at each index set of ties, and
     analogously ‘"last"’ with decreasing values. The ‘"random"’
     method puts these in random order whereas the default,
     ‘"average"’, replaces them by their mean, and ‘"max"’ and ‘"min"’
     replaces them by their maximum and minimum respectively, the
     latter being the typical sports ranking.
    

    Traduction à l'arrache :

    Synopsis:

     Retourne les rangs des éléments contenus dans la liste indiquée. Propose
     plusieurs possibilités de traitement des éléments ayant des valeurs égales
     ou/et manquantes.
    

    Signature:

     rank(x, na.last = TRUE,
     ties.method = c("average", "first", "last", "random", "max", "min"))
    

    Arguments:

     ...
     ties.method: une chaîne de charactère indiquant comment ranger les éléments de
     même(s) valeur(s). Voir la section « détails » ici-bas.
    

    Détails:

     Les rangs seront bien définis si toutes les valeurs sont différentes et
     s'il n y a pas de valeurs manquantes : ce sera le résultat d'une
     permutation de seq_along(x). S'il y a certains éléments partageant des
     valeurs égales (appelées « égalités » dans la suite), leurs rangs
     dépendront de l'argument « ties.method » qui prend les valeurs suivantes :
     "first", les rangs des égalités sont pris suivant les indices croissants
     selon lesquels elles apparaissent dans la liste en entrée ; "last" procède
     comme "first", cette fois-ci en prenant les indices décroissants ;
     "random" range aléatoirement les égalités ; "average" est la méthode
     utilisée par défaut et moyenne les rangs des égalités ; "max" considère le
     rang de la dernière égalité à apparaître dans la liste ; "min" en
     considère celui de la première ...
    

    Talk is cheap, show me the code.

    print(R.version.string)
    set.seed(39)
    eg <- new.env(parent = emptyenv())
    eg$b <- c(21L, 58L, 21L, 0L)
    eg$critères <- c("first", "last", "random", "average", "max", "min")
    print(eg$b)
    for (i in eg$critères) cat(i, "\t: ", rank(b, ties.method = i), "\n")

    Les sorties ressemblent à quelque chose du genre

    [1] "R version 3.3.2 (2016年10月31日)"
    [1] 21 58 21 0
    first : 2 4 3 1
    last : 3 4 2 1
    random : 3 4 2 1
    average : 2.5 4 2.5 1
    max : 3 4 3 1
    min : 2 4 2 1