2011-08-08 38 views
10

我最近發現data.table包,現在想知道是否應該替換一些我的plyr代碼。總而言之,我非常喜歡plyr,而且我基本達到了我想要的一切。然而,我的代碼運行了一段時間,加快速度的前景足以讓我運行一些測試。那些測試很快就結束了,這就是原因。在data.table包中使用日期

我做了很多經常與plyr是包含日期一欄分割我的數據,並做一些計算:

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"]}) 

然而,使用與日期格式列似乎並不在數據工作.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. 

如果我正確理解包,我使用setkey()時只會獲得顯着的加速。另外,我認爲在日期和數字之間不斷進行轉換並不是很好的編碼。所以我錯過了什麼,或者有沒有簡單的方法來實現與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

我還沒有使用data.table,但請注意,Sys.time()返回'POSIXct'日期時間值,而不是'日期'。特別是,返回的值(自1970年1月1日以來經過的秒數)通常不是整數值,因此轉換爲整數將確實會丟失信息,因爲錯誤消息表示 –

+1

請注意,data.table可以產生即使你不使用'setkey',執行時間也會有相當大的改善。 – Andrie

回答

7

這應該工作:

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) 

的data.table包中包含有整數存儲模式的一些日期/時間類。 見?IDateTime

的日期和時間類與整數存儲爲快速排序和分組 。仍然是實驗!

  • IDate是從Date衍生的日期類。它與Date類具有相同的內部表示形式,但存儲模式爲整數。
  • ITime是一個時間類,它存儲爲一天中的整數秒數。 as.ITime不允許超過24小時的時間。由於ITime以秒爲單位存儲,因此可以將其添加到POSIXct對象,但不應將其添加到Date對象。
  • IDateTime需要日期時間輸入並返回列datetime列的數據表。
+0

謝謝,這有所幫助。我實際上使用的是lubridate,這反過來對ggplot2非常有用。由於所有三個軟件包(lubridate,ggplot2,plyr)來自同一作者,並且工作得很好,所以我想我會留在他們一段時間而不是製作開關。但是你的回答提供了一個很好的解決方法,當我有時間時,我想我會玩弄並用data.table測試速度的改進。再次感謝! –