2010-11-22 19 views
5

Existe-t-il une fonctionnalité intégrée dans R pour trier les vecteurs de caractères prenant en compte les cas? sort et order ignorer le cas:Ne pas ignorer le cas dans le tri des chaînes de caractères

tv <- c("a", "A", "ab", "B") 
sort(tv) 
## [1] "a" "A" "ab" "B" 

Ceci est ma solution à ce jour:

CAPS <- grep("^[A-Z]", tv) 
c(sort(tv[CAPS]), sort(tv[-CAPS])) 
## [1] "A" "B" "a" "ab" 

Répondre

10

Après post about Auto-completion in Notepad++, vous pouvez modifier les paramètres locaux:

Sys.setlocale(, "C") 
sort(tv) 
# [1] "A" "B" "a" "ab" 

EDIT. Je lis les pages d'aide à Sys.setlocale et il semble que le changement LC_COLLATE suffit: Sys.setlocale("LC_COLLATE", "C")

Vous pouvez envelopper dans une fonction si vous l'utilisez plus d'une fois:

sortC <- function(...) { 
    a <- Sys.getlocale("LC_COLLATE") 
    on.exit(Sys.setlocale("LC_COLLATE", a)) 
    Sys.setlocale("LC_COLLATE", "C") 
    sort(...) 
} 
+0

J'ai eu exactement le problème inverse, à savoir mon LC_COLLATE par défaut était "C" et je voulais utiliser l'ordre insensible à la casse. Je n'ai rien trouvé de mieux que d'essayer quelques locales installées et de substituer la 3ème ligne de la fonction avec Sys.setlocale ("LC_COLLATE", "eu_ES.iso88591"). Je suis sûr que c'est faux. Quelle est la bonne façon de faire cela? –

+0

Une meilleure méthode consiste à utiliser 'stringr :: str_sort' et vous pouvez assigner des paramètres régionaux pour obtenir un résultat cohérent. – dracodoc