Sắp xếp các hàng trong data.table theo thứ tự giảm dần trên khóa chuỗi `order (-x, v)` gây ra lỗi trên data.table 1.9.4 trở về trước


125

Hãy nói rằng tôi có những điều sau đây data.tabletrong R:

  library(data.table)
  DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)

Tôi muốn đặt nó theo hai cột (nói cột xv). Tôi đã sử dụng điều này:

 DT[order(x,v)] # sorts first by x then by v (both in ascending order)

Nhưng bây giờ, tôi muốn sắp xếp nó theo x(theo thứ tự giảm dần) và có đoạn mã sau:

  DT[order(-x)] #Error in -x : invalid argument to unary operator

Do đó, tôi nghĩ lỗi này là do thực tế rằng class(DT$x)=character. Bạn có thể cho tôi bất kỳ đề nghị để giải quyết vấn đề này?

Tôi biết tôi có thể sử dụng DT[order(x,decreasing=TRUE)], nhưng tôi muốn biết cú pháp để sắp xếp theo một số cột bằng cả hai cách (một số giảm, một số tăng) cùng một lúc.

Lưu ý rằng nếu bạn sử dụng DT[order(-y,v)]kết quả là ok, nhưng nếu bạn sử dụng DT[order(-x,v)]có lỗi. Vì vậy, câu hỏi của tôi là: làm thế nào để giải quyết lỗi này?


6
Câu hỏi thú vị, nhưng nếu bạn đang làm việc với các tập dữ liệu lớn, có thể bạn sẽ cài đặt các khóa cho data.tables của mình. Các khóa đặt dữ liệu của bạn theo thứ tự tối đa hóa việc lập chỉ mục, tập hợp con, tập hợp theo nhóm, v.v. Đó có thể không phải là định dạng ưa thích của bạn để in dữ liệu, nhưng thường là một cái giá nhỏ để trả cho tốc độ mà nó sẽ giúp bạn đạt được .
Josh O'Brien

Tuy nhiên, đối với tôi, đó DT[order(-x)]không phải là một tuyên bố tương đương setorder(DT, -x)setorder()thực sự hành động DTtrong khi người kia thì không. Các câu lệnh tương đương sẽ là setorder DT <- DT [order (-x)] (DT, -x) Tôi rất mới với R vì vậy hãy sửa nếu tôi nhầm.
jeromeResearch

@jerome Bạn đúng rồi. Pankil không nói rằng chúng tương đương nhau, vì vậy tôi đoán nó vẫn ổn.
Frank

1
Tôi đồng ý với @smci rằng chỉnh sửa tiêu đề có ý nghĩa ở đây, mặc dù tôi sẽ thay đổi nó để chỉ ra rằng câu hỏi này không còn phù hợp, ví dụ: bằng cách thêm "trong data.table 1.9.4 hoặc sớm hơn" vào tiêu đề để mọi người không tiếp tục hạ cánh ở đây từ google mong đợi một cái gì đó khác. Tôi đã làm điều này với một trong những câu hỏi của tôi stackoverflow.com/questions/30035939/ trộm
Frank

1
Nestorggh, xin vui lòng không quay lại tiêu đề mới trừ khi bạn có thể cải thiện nó. "Sắp xếp các hàng trong data.table" hầu như không nói gì, chức năng cơ bản đã có cho các yonks. Tiêu đề cần đề cập đến vấn đề thực tế của bạn (nhiều khóa trong đó một khóa là thứ tự decr). Cũng quan trọng rằng đây là một vấn đề đã biết trong 1.9.4 trở về trước và không còn là vấn đề nữa.
smci

Câu trả lời:


144

Cập nhật

data.table v1.9.6 + hiện hỗ trợ nỗ lực ban đầu của OP và câu trả lời sau đây không còn cần thiết nữa.


Bạn có thể sử dụng DT[order(-rank(x), y)].

   x y v
1: c 1 7
2: c 3 8
3: c 6 9
4: b 1 1
5: b 3 2
6: b 6 3
7: a 1 4
8: a 3 5
9: a 6 6

1
Như @PankilShah đã chỉ ra dưới đây, điều này đã được khắc phục trong một thời gian và cách tiếp cận ban đầu của OP hiện hoạt động như mong đợi. Tôi không thể tìm thấy cam kết vì nó đã được sửa ở cấp độ C và tôi không biết phải tìm kiếm gì.
MichaelChirico

1
Tuyệt thật, cảm ơn nhé. Dường như không ai có thể kết thúc ở đây ... nhưng mặt khác, bản thân tôi đã kết thúc ở đây từ việc googling một cái gì đó mơ hồ liên quan.
MichaelChirico

@MichaelChirico thực sự, tôi thường xuyên nhận được nhiều phiếu bầu cho câu trả lời này, vì vậy tôi thực sự rất vui vì bạn đã chỉ ra điều này. Tôi không thực sự là người dùng data.table và không theo kịp sự phát triển của nó.
Matthew Plourde

Nó rất hữu ích để ghi rõ số lượng phát hành thực tế (1.9.6?), Vì vậy chúng tôi không cần phải đi săn trong các tài liệu lưu trữ của NEWS.md .
smci

23

Bạn chỉ có thể sử dụng -trên các mục số, vì vậy bạn có thể sử dụng giảm và phủ định những mục bạn muốn theo thứ tự tăng dần:

DT[order(x,-v,decreasing=TRUE),]
      x y v
 [1,] c 1 7
 [2,] c 3 8
 [3,] c 6 9
 [4,] b 1 1
 [5,] b 3 2
 [6,] b 6 3
 [7,] a 1 4
 [8,] a 3 5
 [9,] a 6 6

3
Tôi thích cách này, trừ khi bạn có hai charactercột và bạn muốn sắp xếp một cột tăng và cột kia giảm.
Matthew Plourde

1
@mplourde Tôi nghĩ bạn có thể kết hợp giải pháp của mình với giải pháp này để giải quyết vấn đề bạn đã đặt ra. Chẳng hạn, bạn có thể đặt: DT[order(x,-rank(w),decreasing=TRUE)]cho rằng xwcả hai cột ký tự. Cảm ơn bạn!
nhern121

17

DT[order(-x)]hoạt động như mong đợi. Tôi có data.table phiên bản 1.9.4. Có lẽ điều này đã được sửa trong một phiên bản gần đây.
Ngoài ra, tôi đề nghị setorder(DT, -x)cú pháp phù hợp với các lệnh set * như setnames,setkey

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.