#r #data.table
#r #данные.таблица
Вопрос:
Я пытаюсь отсортировать строки data.table
(R-3.3.1 Win x64 amp; data.table_1.9.6) и обнаружил, что setorder
отличается от base::sort
. Правильно ли я использую setorder?
dt <- data.table(A=c("AA","AB","Ab"))
setorder(dt, A)
identical(dt[,A], sort(dt[["A"]]))
#[1] FALSE
df <- data.frame(A=c("AA","AB","Ab"))
identical(df[order(df$A),"A"], sort(df[["A"]]))
#[1] TRUE
Ответ №1:
Мы можем воспроизвести это с помощью sort
, если мы установим метод в «radix», который был принят в base R из сортировки data.table:
sort(dt[["A"]])
#[1] "AA" "Ab" "AB"
sort(dt[["A"]], method = "radix")
#[1] "AA" "AB" "Ab"
В help("sort")
мы находим:
За исключением метода «radix», порядок сортировки символьных векторов будет зависеть от последовательности сортировки используемой локали: см. Сравнение.
…Однако при сортировке по основанию есть некоторые оговорки: если x является символьным вектором, все элементы должны использовать одну и ту же кодировку. Поддерживаются только кодировки UTF-8 (включая ASCII) и Latin-1. Параметры сортировки всегда соответствуют языковому стандарту «C».
Sys.setlocale(category = "LC_ALL", locale = "C")
sort(dt[["A"]])
#[1] "AA" "AB" "Ab"