2016-10-20 3 views
0

Я пытаюсь сортировать строки data.table (R-3.3.1 Win x64 & data.table_1.9.6) и обнаружил, что setorder отличается от base::sort. Я правильно использую setorder?Сравнение data.table :: 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", который был принят в базе R от сортировки data.table в:

sort(dt[["A"]]) 
#[1] "AA" "Ab" "AB" 
sort(dt[["A"]], method = "radix") 
#[1] "AA" "AB" "Ab" 

В help("sort") мы находим:

За исключением метода «радикс», порядок сортировки для символьных векторов будет зависеть от последовательности сортировки используемого языка: 0 см. Сравнение.
...

Однако существуют некоторые предостережения с сортировкой по основанию: если x является символьным вектором, все элементы должны иметь одинаковую кодировку. Поддерживаются только кодировки UTF-8 (включая ASCII) и Latin-1. Сортировка всегда соответствует языку «C».

Sys.setlocale(category = "LC_ALL", locale = "C") 
sort(dt[["A"]]) 
#[1] "AA" "AB" "Ab" 

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

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