2010-11-22 4 views
5

Есть ли встроенная функциональность в R для сортировки символьных векторов с учетом случая? sort и order игнорировать случай:Не игнорировать регистр при сортировке символьных строк

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

Это мое решение до сих пор:

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

ответ

10

После post about Auto-completion in Notepad++ можно изменить локальные параметры:

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

EDIT. Я читаю страницы справки в Sys.setlocale и, кажется, что изменение LC_COLLATE достаточно: Sys.setlocale("LC_COLLATE", "C")

Вы можете обернуть его в функцию, если вы используете его несколько раз:

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

У меня была точно противоположная проблема, то есть мой default LC_COLLATE был «C», и я хотел использовать регистр, нечувствительный к регистру. Я не нашел ничего лучше, чем попробовать некоторые установленные локали, и заменил 3-ей строку функции на Sys.setlocale («LC_COLLATE», «eu_ES.iso88591»). Я уверен, что это неправильно. Каков правильный способ сделать это? –

+0

Лучшим методом является использование 'stringr :: str_sort', и вы можете назначить локаль, чтобы она имела согласованный результат. – dracodoc

Смежные вопросы