2013-08-20 39 views
9

Hôm qua tôi đã phải mất một chút thời gian để tìm lỗi trong mã của mình và tôi thấy rằng data.table sắp xếp các chuỗi theo cách khác một chút so với cơ sở. Đây có phải là một hành vi bình thường và cách hiệu quả nhất (có lợi ích nào của data.table) để tái tạo các kết quả thu được với hàm cơ bản order? Dưới đây là một món đồ chơi tái sản xuất ví dụ:Cách sắp xếp chuỗi dữ liệu khi thiết lập khóa

library(data.table) 
options(stringsAsFactors = FALSE) 

d <- data.frame(cn=c("USA","Ubuntu","Uzbekistan")) 
d[order(d$cn),,drop=F] 

#   cn 
#2  Ubuntu 
#1  USA 
#3 Uzbekistan 

dt <- data.table(d) 
setkey(dt, cn) 
dt 

#   cn 
#1:  USA 
#2:  Ubuntu 
#3: Uzbekistan 

options(stringsAsFactors = default.stringsAsFactors()) 

Hệ điều hành Windows 7

+0

HĐH của bạn là gì? – GSee

+0

Hệ điều hành của tôi là Windows 7 – jem77bfp

Trả lời

9

Cập nhật tháng 3 năm 2014

Đã có một số cuộc tranh luận về việc này. Kể từ v1.9.2, chúng tôi đã giải quyết ngay bây giờ trên setkey sắp xếp bằng ngôn ngữ C; ví dụ: tất cả các chữ cái viết hoa đều xuất hiện trước tất cả các chữ thường, bất kể ngôn ngữ của người dùng. Đây là một thay đổi được thực hiện trong v1.8.8 mà chúng tôi đã có ý định đảo ngược nhưng đã bị mắc kẹt với bây giờ.

Xem xét save() -ing một bảng được khóa trong ngôn ngữ của bạn và một đồng nghiệp load() -giữ nó bằng ngôn ngữ khác. Khi họ tham gia vào bảng đó, nó có thể không hoạt động chính xác nếu đó là thứ tự sắp xếp địa phương. Chúng ta phải suy nghĩ cẩn thận hơn nếu setkey là cho phép đặt lại ngôn ngữ một lần nữa, có thể bằng cách lưu tên miền địa phương cùng với thuộc tính "được sắp xếp", do đó, data.table ít nhất có thể so sánh và phát hiện nếu ngôn ngữ hiện tại khác với ngôn ngữ hiện tại setkey.

Đó cũng là lý do tốc độ khi sắp xếp theo ngôn ngữ chậm hơn nhiều so với ngôn ngữ C. Mặc dù, chúng ta có thể làm điều đó một cách hiệu quả nhất có thể và cho phép nó tùy ý là lý tưởng.

Do đó, đây là yêu cầu tính năng và nhận xét thêm được hoan nghênh.

FR#4842 setkey to sort using session's locale not C locale



đẹp bắt! Gọi tới số setkey lần lượt gọi setkeyv và gọi số fastorder để "đặt hàng" các cột/mục nhập mà lần lượt gọi chorder.

chorder lần lượt gọi hàm C Ccountingcharacter.c. Bây giờ, ở đây tôi cho rằng vấn đề là do "ngôn ngữ".

Hãy xem những gì "miền địa phương" tôi đang sử dụng mac của mình.

Sys.getLocale() 
# [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8" 

Bây giờ chúng ta hãy xem làm thế nào order loại nó:

x <- c("USA", "Ubuntu", "Uzbekistan") 
order(x) 
# [1] 2 1 3 

Bây giờ, chúng ta hãy thay đổi "Locale" thành "C".

Sys.setlocale("LC_ALL", "C") 
# [1] "C/C/C/C/C/en_US.UTF-8" 

order(x) 
# [1] 1 2 3 

Từ ?order:

Thứ tự sắp xếp cho vectơ nhân vật sẽ phụ thuộc vào trình tự collating của miền địa phương trong sử dụng: xem Comparison.

Từ ?Comparison:

So sánh chuỗi trong vectơ nhân vật là tự từ điển trong chuỗi bằng cách sử dụng chuỗi collating của miền địa phương trong sử dụng: xem miền địa phương. Chuỗi đối sánh các ngôn ngữ như en_US thường khác với C (nên sử dụng ASCII) và có thể gây ngạc nhiên. Cẩn thận với việc đưa ra bất kỳ giả định nào về thứ tự đối chiếu: ví dụ: trong Z Estonia đến giữa S và T, và collation không nhất thiết phải là nhân vật-by-nhân vật - trong các loại aa Đan Mạch như một lá thư duy nhất, sau khi z ....

Vì vậy, về cơ bản, order cũng dưới " C "locale, cho cùng thứ tự như 's setkey. Tôi đoán là chức năng C được gọi là bởi chorder sẽ tự động chạy trên C-locale sẽ so sánh giá trị ascii mà "S" đến trước "b".

Có lẽ điều quan trọng là phải mang điều này đến sự chú ý của @ MatthewDowle (nếu anh ấy chưa biết về nó). Vì vậy, tôi muốn đề nghị bạn nộp nó như là một lỗi here (chỉ để chắc chắn).

+0

+1 công việc khảo sát tốt đẹp –

+0

công việc hay, nhưng tôi sẽ không gọi đây là lỗi, có thể là yêu cầu tính năng – eddi

2

Vâng, tôi không chắc chắn những gì cách hiệu quả nhất là nhưng bạn có thể làm như sau để tạo lại kết quả data.frame.

dt[order(dt$cn)] 

      cn 
1:  Ubuntu 
2:  USA 
3: Uzbekistan 
+1

hoạt động tốt, nhưng với bộ dữ liệu lớn hơn, nó có thể chậm hơn nhiều so với setkey – jem77bfp

+0

Tôi đồng ý. Nó có vẻ như nó có thể có một cái gì đó để làm với phương pháp sắp xếp được sử dụng trong setkey. Đây là những gì nó nói trong setkey? (Tuy nhiên tôi không thể tìm thấy một tùy chọn để thiết lập phương pháp sắp xếp trong setkey) _Các loại được cố gắng với rất nhanh "radix" phương pháp trong sort.list. Nếu không thành công, sắp xếp lại sẽ chuyển thành phương thức mặc định theo thứ tự. Logic đó được lặp lại cột theo cột._ Có thể ai đó khác biết nhiều hơn? –

Các vấn đề liên quan