Сравнение данных.table::setorder с базой ::sort

#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"