2013-07-25 49 views
8

Tôi có một số dữ liệu phải được định dạng là (% d /% m /% Y). Dữ liệu nằm ngoài thứ tự thời gian vì nó được sắp xếp theo số đầu tiên là ngày, không phải là tháng.Đặt dataframe theo thứ tự thời gian dựa trên các ngày được định dạng% d /% m /% Y

Tôi hy vọng tôi có thể chỉ định cho order hoặc reorder mà tôi muốn sắp xếp diễn ra khác nhau. Tôi chỉ không chắc chắn làm thế nào để làm điều này.

Dưới đây là một số dữ liệu ngày được ra lệnh:

date 
1/1/2009 
1/1/2010 
1/1/2011 
5/4/2009 
5/4/2011 
10/2/2009 
10/3/2011 
15/9/2010 
15/3/2009 
31/12/2011 
31/7/2009 

Thanks cho bất kỳ lời đề nghị.

+0

Bạn cũng muốn giữ gìn mà ngày-chuỗi trong nó định dạng gốc ví dụ để dán nhãn ve trên lô? tức là bảo tồn dưới dạng một cột riêng biệt – smci

Trả lời

10

Khi đặt hàng theo cột date chuyển đổi định dạng ngày.

df[order(as.Date(df$date,format="%d/%m/%Y")),,drop=FALSE] 
     date 
1 1/1/2009 
6 10/2/2009 
9 15/3/2009 
4 5/4/2009 
11 31/7/2009 
2 1/1/2010 
8 15/9/2010 
3 1/1/2011 
7 10/3/2011 
5 5/4/2011 
10 31/12/2011 
+0

Cảm ơn! Nó khiến tôi băn khoăn không biết bao nhiêu lần tôi phải nói với R là một ngày, nhưng tôi đoán câu trả lời là "mọi lúc". – Nazer

0

Ugly nhưng dường như làm việc:

date[order(sapply(strsplit(date, "/"), 
        function(x) { paste(x[3], sprintf("%02d", as.integer(x[1])), 
              sprintf("%02d", as.integer(x[2])), 
              sep="") 
           } 
       ) 
     ) 
    ] 
+0

Bạn có muốn thêm một số nhận xét và thụt đầu dòng vào mã của mình để chúng tôi có thể đọc nó tốt hơn (và tránh cuộn ngang) không? –

8

Đây là dễ dàng hơn với một chút giúp đỡ từ plyr và lubridate:

library(lubridate) 
library(plyr) 

df <- read.csv(text = "date 
1/1/2009 
1/1/2010 
1/1/2011 
5/4/2009 
5/4/2011 
10/2/2009 
10/3/2011 
15/9/2010 
15/3/2009 
31/12/2011 
31/7/2009", stringsAsFactors = FALSE) 

# Convert variable to date  
df$date <- dmy(df$date) 
arrange(df, date) 
# Or for descending order 
arrange(df, desc(date)) 
+1

Tôi cầu xin sự khác biệt về * dễ dàng hơn * bạn tuyên bố ở đây là các giải pháp được chấp nhận thắng bởi không yêu cầu các gói bổ sung và cũng giải quyết được vấn đề trong một câu lệnh duy nhất. –

+3

Bạn có thể chơi golf nếu muốn. Tôi nghĩ giải pháp của tôi là một giải pháp thay thế tốt vì bạn không cần biết về cách chuỗi định dạng ngày hoạt động hoặc tại sao bạn cần 'drop = FALSE' – hadley

+1

Bạn được chào đón tạo lại R thành 'H' bằng cách thay thế/xác định lại từng đơn khía cạnh R gì. Rất nhiều cối xay gió còn lại ở Tây Ban Nha để bạn hét lên, Don Quixote :) –