45 votes

La lettre "y" vient après la lettre "i" lors du tri alphabétique

Lors de l'utilisation de la fonction sort(x), où x est un caractère, la lettre "y" saute au milieu, juste après la lettre "i" :

> letters
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t"
[21] "u" "v" "w" "x" "y" "z"

> sort(letters)
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "y" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[21] "t" "u" "v" "w" "x" "z"

La raison peut être que je suis situé en Lituanie, et c'est un tri "à la lituanienne" des lettres, mais j'ai besoin d'un tri normal. Comment puis-je changer la méthode de tri pour revenir à la normale dans le code R ?

J'utilise R 2.15.2 sur Win7.

39voto

Gavin Simpson Points 72349

Vous devez changer la locale dans laquelle R s'exécute. Faites-le soit pour l'ensemble de votre installation Windows (ce qui semble peu optimal) soit à l'intérieur des sessions R via :

Sys.setlocale("LC_COLLATE", "C")

Vous pouvez utiliser n'importe quelle autre chaîne de locale valide à la place de "C" là, mais cela devrait vous ramener à l'ordre de tri que vous souhaitez pour letters.

Lisez ?locales pour plus d'informations.

Je suppose qu'il vaut la peine de noter la fonction sœur Sys.getlocale(), qui interroge le paramètre de locale actuel. Par conséquent, vous pourriez faire

(locCol <- Sys.getlocale("LC_COLLATE"))
Sys.setlocale("LC_COLLATE", "lt_LT")
sort(letters)
Sys.setlocale("LC_COLLATE", locCol)
sort(letters)
Sys.getlocale("LC_COLLATE")

## donnant :
> (locCol <- Sys.getlocale("LC_COLLATE"))
[1] "en_GB.UTF-8"
> Sys.setlocale("LC_COLLATE", "lt_LT")
[1] "lt_LT"
> sort(letters)
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "y" "j" "k" "l" "m" "n"
[16] "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "z"
> Sys.setlocale("LC_COLLATE", locCol)
[1] "en_GB.UTF-8"
> sort(letters)
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o"
[16] "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
> Sys.getlocale("LC_COLLATE")
[1] "en_GB.UTF-8"

ce qui est bien sûr ce que montre la réponse de @Hadley avec with_collate() de manière un peu plus succincte une fois que vous avez installé devtools.

34voto

hadley Points 33766

Si vous souhaitez le faire temporairement, devtools fournit la fonction with_collate :

library(devtools)
with_collate("C", sort(letters))
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
# [20] "t" "u" "v" "w" "x" "y" "z"
with_collate("lt_LT", sort(letters))
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "y" "j" "k" "l" "m" "n" "o" "p" "q" "r"
# [20] "s" "t" "u" "v" "w" "x" "z"

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