2010-05-27 7 views
7

Giả sử trong R, tôi có một data.frame với cột đầu tiên đại diện cho thời gian (như POSIXct). Phần còn lại của các cột (ví dụ: cột 2) là dữ liệu số.Làm cách nào để nhanh chóng nhóm cột thời gian trong một khung dữ liệu thành các khoảng thời gian?

Tôi muốn nhóm thời gian thành các khoảng thời gian 3 phút. Mỗi khoảng thời gian sẽ là giá trị trung bình của các giá trị rơi vào khoảng thời gian cụ thể đó.

Hiện tại, tôi có vòng lặp for lặp lại qua cột thời gian và tạo khoảng thời gian khi đang di chuyển. Tôi tự hỏi nếu có một cách thanh lịch hơn để thực hiện điều tương tự?

Xin cảm ơn trước.

Derek

+0

câu hỏi tương tự http://stackoverflow.com/questions/2441136/what-is-an-efficient- phương pháp-cho-phân vùng-và-tổng hợp-khoảng thời gian-từ-thời gian – Marek

Trả lời

9

Tôi nghĩ rằng một lệnh như sau, sẽ trả về một danh sách các giá trị mà rơi vào 3 phút. (v là tên của dataframe và datecol là tên của cột ngày)

library(plyr) 

v<-data.frame(datecol=as.POSIXct(c(
    "2010-01-13 03:02:38 UTC", 
    "2010-01-13 03:03:14 UTC", 
    "2010-01-13 03:05:52 UTC", 
    "2010-01-13 03:07:42 UTC", 
    "2010-01-13 03:09:38 UTC", 
    "2010-01-13 03:10:14 UTC", 
    "2010-01-13 03:12:52 UTC", 
    "2010-01-13 03:13:42 UTC", 
    "2010-01-13 03:15:42 UTC", 
    "2010-01-13 03:16:38 UTC", 
    "2010-01-13 03:18:14 UTC", 
    "2010-01-13 03:21:52 UTC", 
    "2010-01-13 03:22:42 UTC", 
    "2010-01-13 03:24:19 UTC", 
    "2010-01-13 03:25:19 UTC" 
)), x = cumsum(runif(15)*10),y=cumsum(runif(15)*20)) 


dlply(v,.(cut(datecol,"3 min")),"[") 
+0

Bạn có chắc bạn có thể làm 'cắt()' trên các loại POSIXct? Tôi gặp lỗi khi thử. –

+0

@Dirk Eddelbuettel: Tôi đã chỉnh sửa để bao gồm dataframe tôi đã thử nghiệm –

6

Sở thú và XTS gói vượt trội ở đây và có tài liệu dồi dào. Đây là một tiền đóng hộp to.minutes3, nhưng tôi cũng sử dụng aggregate.zoo() với các chức năng tùy chỉnh làm như vậy bằng tay:

> library(xts) 
> x <- xts(cumsum(abs(rnorm(20))), Sys.time()+60*(0:19)) 
> x 
         [,1] 
2010-05-27 14:44:25 1.2870 
2010-05-27 14:45:25 3.3187 
2010-05-27 14:46:25 4.0976 
2010-05-27 14:47:25 5.3304 
2010-05-27 14:48:25 6.9415 
2010-05-27 14:49:25 7.4508 
2010-05-27 14:50:25 8.5281 
2010-05-27 14:51:25 8.7145 
2010-05-27 14:52:25 9.0120 
2010-05-27 14:53:25 10.5063 
2010-05-27 14:54:25 11.6312 
2010-05-27 14:55:25 11.9813 
2010-05-27 14:56:25 13.8883 
2010-05-27 14:57:25 14.1696 
2010-05-27 14:58:25 14.3269 
2010-05-27 14:59:25 14.6768 
2010-05-27 15:00:25 15.4926 
2010-05-27 15:01:25 16.8408 
2010-05-27 15:02:25 18.7739 
2010-05-27 15:03:25 19.7815 
> to.minutes3(x) 
        x.Open x.High x.Low x.Close 
2010-05-27 14:44:25 1.2870 1.2870 1.2870 1.2870 
2010-05-27 14:47:25 3.3187 5.3304 3.3187 5.3304 
2010-05-27 14:50:25 6.9415 8.5281 6.9415 8.5281 
2010-05-27 14:53:25 8.7145 10.5063 8.7145 10.5063 
2010-05-27 14:56:25 11.6312 13.8883 11.6312 13.8883 
2010-05-27 14:59:25 14.1696 14.6768 14.1696 14.6768 
2010-05-27 15:02:25 15.4926 18.7739 15.4926 18.7739 
2010-05-27 15:03:25 19.7815 19.7815 19.7815 19.7815 
>