Это связано с «локалью», в которой ваш компьютер считает, что он должен выполнять сортировку. Таким образом, у меня есть
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)
возвращает сектора в желаемом порядке.
Awesome. Это сработало. Спасибо. – bhamu
Странно, когда я использовал это на одном, у меня были разные результаты. Для этого одного сектора <- c («[Cash]», «[Unassigned]», «Consumer Discretionary», «Consumer Staples») > сортировка (сектора) [1] «Потребительские дискреционные» «Потребительские скрепки» «[ Cash] " [4]" [Неназначенный] " – bhamu
@bhamu - попытался уточнить в своем ответе, что локали обрабатывают символы по-разному, например, en_US.UTF-8 рассматривает '[' как тихий для целей сопоставления. Аккуратно, а? –