2014-09-17 2 views
3

У меня возникла странная проблема и надеюсь, что кто-то может мне помочь. Работа проста и, похоже, работает нормально на машине Windows, но ведет себя по-другому. Ниже поведение я вижу в R версии 3.0.2 на Linux машинеR sort on linux с квадратной скобкой в ​​тексте, кажется, игнорирует

names <- c('lender1', '[cash]', 'acc1') 
names 
# [1] "lender1" "[cash]" "acc1" 
sort(names) 
# [1] "acc1" "[cash]" "lender1" 

На машине окна

names <- c('lender1', '[cash]', 'acc1') 
names 
# [1] "lender1" "[cash]" "acc1" 
sort(names) 
# [1] "[cash]" "acc1" "lender1" 

Оказывается, что на Unix машине он игнорирует [ и сортировки текста , Как я могу заставить его использовать [ и сортировать его так, как это делается на платформе Windows. Это имена столбцов фрейма данных и должны иметь [наличные], входящие в первую колонку. Цените любую помощь

ответ

6

Это связано с «локалью», в которой ваш компьютер считает, что он должен выполнять сортировку. Таким образом, у меня есть

names <- c('lender1', '[cash]', 'acc1') 
Sys.getlocale(category="LC_COLLATE") 
## [1] "en_US.UTF-8" 
sort(names) 
## [1] "acc1" "[cash]" "lender1" 
Sys.setlocale(category="LC_COLLATE", locale="C") 
## [1] "C" 
sort(names) 
## [1] "[cash]" "acc1" "lender1" 

Но конкретный язык (и возможность его установки в интерактивном режиме) зависит от конкретной системы. ?Sys.setlocale имеет дополнительную информацию, включая указатель к руководству по установке и администрированию R (раздел 7) RShowDoc("R-admin").

Для примера @bhamu включает в комментарии ниже, я

> Sys.setlocale(category="LC_COLLATE", locale="en_US.UTF-8") 
[1] "en_US.UTF_8" 
> sort(sectors) 
[1] "[Cash]"     "Consumer Discretionary" "Consumer Staples"  
[4] "[Unassigned]"  

где в en_US-UTF.8 «[» символ трактуется как молчание - игнорируется во время сортировки, так Кассовые сорта перед тем и Нераспределенная сортировка после Потребителя. В то время как для

> Sys.setlocale(category="LC_COLLATE", locale="C") 
[1] "C" 
> sort(sectors) 
[1] "Consumer Discretionary" "Consumer Staples"  "[Cash]"     
[4] "[Unassigned]" 

вещей следуют традиционному ASCII table и «[» сорта после заглавной и до нижнего регистра алфавитных символов. Правила для разных локаций сложны и интересны с лингвистической точки зрения (я сомневаюсь, что можно использовать сортировку 0 перед A-Z во всех локалях, что подразумевается в следующем примере работы @ bhamu); для многих вычислительных задач действительно нужен locale = «C».

Я не уверен, что следующее полностью кросс-платформенная совместимость (более ранние версии ?Sys.setlocale() были менее оптимистичны об этом, работает ли на Windows, например), но подход к обеспечению стандартного порядок сортировки может быть

mysort <- function(x) { 
    olocale <- Sys.setlocale("LC_COLLATE", "C") 
    on.exit(Sys.setlocale("LC_COLLATE", olocale)) 
    sort(x) 
} 

Кроме того, в случае sectors, похоже, это на самом деле факторы (символьные строки, указывающие на одну из конечного числа уровней), в этом случае с помощью lvls для упорядоченных представлений

sectors <- factor(sectors, levels=lvls) 
sort(sectors) 

возвращает сектора в желаемом порядке.

+0

Awesome. Это сработало. Спасибо. – bhamu

+0

Странно, когда я использовал это на одном, у меня были разные результаты. Для этого одного сектора <- c («[Cash]», «[Unassigned]», «Consumer Discretionary», «Consumer Staples») > сортировка (сектора) [1] «Потребительские дискреционные» «Потребительские скрепки» «[ Cash] " [4]" [Неназначенный] " – bhamu

+0

@bhamu - попытался уточнить в своем ответе, что локали обрабатывают символы по-разному, например, en_US.UTF-8 рассматривает '[' как тихий для целей сопоставления. Аккуратно, а? –

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

  • Нет связанных вопросов^_^