2011-08-08 33 views
10

Gần đây tôi đã phát hiện ra gói data.table và bây giờ tự hỏi có nên thay thế một số mã plyr của tôi hay không. Tóm lại, tôi thực sự thích plyr và về cơ bản tôi đã đạt được mọi thứ tôi muốn. Tuy nhiên, mã của tôi chạy một thời gian và triển vọng tăng tốc mọi thứ đã đủ để tôi chạy một số thử nghiệm. Những bài kiểm tra đó kết thúc khá sớm và đây là lý do.Sử dụng Ngày tháng với gói data.table

Những gì tôi làm khá thường xuyên với plyr là để chia dữ liệu của tôi bằng một cột chứa ngày và làm một số tính toán:

library(plyr) 
DF <- data.frame(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1))) 
#Split up data and apply arbitrary function 
ddply(DF, .(Date), function(df){mean(df$y) - df[nrow(df), "y"]}) 

Tuy nhiên, sử dụng một cột với ngày định dạng dường như không làm việc trong dữ liệu .table:

library(data.table) 
DT <- data.table(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1))) 
setkey(DT, Date) 
#Error in setkey(DT, Date) : Column 'Date' cannot be auto converted to integer without losing information. 

Nếu tôi hiểu gói chính xác, tôi chỉ nhận được tốc độ đáng kể khi tôi sử dụng setkey(). Ngoài ra, tôi nghĩ rằng nó sẽ không được mã hóa tốt để liên tục chuyển đổi giữa Ngày và số. Vì vậy, tôi thiếu một cái gì đó hoặc là chỉ có không có cách dễ dàng để đạt được điều đó với data.table?

sessionInfo() 
R version 2.13.1 (2011-07-08) 
Platform: x86_64-pc-mingw32/x64 (64-bit) 

locale: 
[1] C 

attached base packages: 
[1] grid  stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] data.table_1.6.3 zoo_1.7-2  lubridate_0.2.5 ggplot2_0.8.9 proto_0.3-9.2 reshape_0.8.4 
[7] reshape2_1.1  xtable_1.5-6  plyr_1.5.2  

loaded via a namespace (and not attached): 
[1] digest_0.5.0 lattice_0.19-30 stringr_0.5  tools_2.13.1 
+1

Tôi chưa sử dụng data.table, nhưng lưu ý rằng Sys.time() trả về giá trị datetime 'POSIXct', không phải là' Date'. Đặc biệt, giá trị trả về (số giây trôi qua kể từ 1/1/1970) nói chung không phải là một giá trị tích phân, do đó chuyển đổi sang một số nguyên thực sự sẽ mất thông tin khi thông báo lỗi nói –

+1

Lưu ý rằng dữ liệu có thể mang lại cải thiện đáng kể trong thời gian thực hiện ngay cả khi bạn không sử dụng 'setkey' – Andrie

Trả lời

7

này nên làm việc:

DT <- data.table(Date=as.ITime(rep(c(Sys.time(), Sys.time() + 60), each=6)), 
       y=c(rnorm(6, 1), rnorm(6, -1))) 
setkey(DT, Date) 

Gói data.table chứa một số lớp học ngày/giờ với chế độ lưu trữ số nguyên. Xem ?IDateTime:

ngày và thời gian lớp học với lưu trữ số nguyên cho phân loại nhanh và nhóm. Vẫn còn thử nghiệm!

  • IDate là một lớp học ngày có nguồn gốc từ Date. Nó có cùng biểu diễn nội bộ như lớp Date, ngoại trừ chế độ lưu trữ là số nguyên.
  • ITime là lớp thời gian trong ngày được lưu trữ dưới dạng số nguyên giây trong ngày. as.ITime không cho phép ngày dài hơn 24 giờ. Bởi vì ITime được lưu trữ trong vài giây, bạn có thể thêm nó vào một đối tượng POSIXct, nhưng bạn không nên thêm nó vào đối tượng Date.
  • IDateTime lấy dữ liệu nhập ngày giờ và trả về bảng dữ liệu với các cột datetime.
+0

Cảm ơn, điều đó giúp ích. Tôi đang thực sự sử dụng lubridate, mà lần lượt hoạt động tuyệt vời với ggplot2. Vì cả ba gói (lubridate, ggplot2, plyr) đều từ cùng một tác giả và hoạt động rất tốt trong sự kết hợp, tôi đoán tôi sẽ ở lại với chúng lâu hơn một chút thay vì thực hiện chuyển đổi. Nhưng câu trả lời của bạn cho một giải pháp tốt và khi tôi có thời gian tôi nghĩ rằng tôi sẽ chơi xung quanh và kiểm tra các cải tiến tốc độ với data.table. Cảm ơn một lần nữa! –

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