2013-05-05 55 views
9

Tôi có khung dữ liệu DF với một trong các cột là ngày/giờ và tôi muốn đặt thứ tự khung dữ liệu theo thứ tự giảm dần của cột này.Ngày/giờ đặt hàng theo thứ tự giảm dần trong R

DF <- data.frame(ID=c('ID3', 'ID2','ID1'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10'), age=c(40,30,20)); 

đầu tiên tôi chuyển cột end vào et sử dụng et = as.POSIXct(DF$end,format='%m/%d/%Y %H:%M'), và sử dụng sau, nhưng có những lỗi mà unary nhà điều hành '-' không được chấp nhận cho các đối số:

out <- DF[order(-DF$et),]; 

Tôi cũng đã cố gắng đã sử dụng cờ giảm dần nhưng lại gặp lỗi về các đối số không cùng độ dài.

out <- DF[order(DF$et, descending=TRUE),]; 

Tuy nhiên, thứ tự tăng dần dường như hoạt động: out <- DF[order(DF$et),].

Tôi làm cách nào để đặt hàng theo thứ tự giảm dần (thời gian gần đây nhất trước)? Cảm ơn bạn.

+1

Không có đối số nào được gọi là 'giảm ​​dần'. Đó là 'giảm'. –

+1

Vì bạn mới ở đây, bạn có thể muốn đọc [** about **] (http://stackoverflow.com/about) và [** faq **] (http://stackoverflow.com/faq) về cách SO hoạt động. StackOverflow được thực hiện ** nhiều ** giá trị hơn cho mọi người nếu khi bạn nhận được câu trả lời giải quyết vấn đề của mình, bạn chấp nhận nó bằng cách nhấp vào dấu kiểm nhỏ. Bạn hoàn toàn không có nghĩa vụ phải làm như vậy, nhưng đó là cách tuyệt vời để "trả lại" cho trang web nếu câu trả lời thực tế giải quyết được vấn đề của bạn và giúp giữ trang web luôn sạch sẽ bằng cách xóa câu hỏi được trả lời khỏi stack câu hỏi chưa được trả lời. –

Trả lời

6

Tôi nghĩ rằng điều này sẽ làm việc:

## Slightly bigger dataset with two times on same day: 
DF <- data.frame(ID=c('ID3', 'ID2','ID1','ID4'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10' , '1/1/09 13:11'), age=c(40,30,20,20)); 

## Note to self - ALWAYS include a timezone. 
DF$DTime <- as.POSIXct(DF$end , format = "%d/%m/%y %H:%M" , tz = "GMT") 
DF[ order(DF$DTime , decreasing = TRUE),] 
# ID   end age    DTime 
#2 ID2 6/1/11 14:20 30 2011-01-06 14:20:00 
#1 ID3 4/1/10 12:00 40 2010-01-04 12:00:00 
#4 ID4 1/1/09 13:11 20 2009-01-01 13:11:00 
#3 ID1 1/1/09 11:10 20 2009-01-01 11:10:00 
+0

Điều đó có sắp xếp chính xác các hàng từ cùng một ngày nhưng thời gian khác nhau không? – joran

+2

Còn về 'DF [rev (thứ tự (DF $ end)),] '? – joran

+0

@ joran bạn nói đúng. 'POSIXct' là tốt hơn (tôi nghĩ). –

6

Có một giải pháp dễ dàng và chung cho vấn đề của bạn với vài mã.

Như bạn đã nhận thấy, dấu trừ không hoạt động với Ngày vì ngày phủ định chưa tồn tại!

Tuy nhiên, bạn có thể có cùng tác dụng với chức năng mục đích chung: rev(). Do đó, bạn trộn vòng xoay và thứ tự như:

#init data 
DF <- data.frame(ID=c('ID3', 'ID2','ID1'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10') 
#change order 
out <- DF[rev(order(as.Date(DF$end))),] 

Khi bạn sử dụng dấu trừ với số bạn đang phân loại số âm trong một lần. Tôi nghĩ rằng khi bạn sử dụng hàm rev(), bạn đang thực hiện hai lượt, một để sắp xếp theo thứ tự tăng dần và một để đảo ngược thứ tự. Nhưng trên 3 quan sát, thật khó để nhìn thấy.

Hy vọng điều đó sẽ hữu ích.

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