2015-02-05 35 views
2

閱讀?IDate這似乎是一個好主意,我的字符變量轉換爲整數日期在我的大數據表中。誰不希望快速排序和分組?Difftime緩慢與data.table ID在R

IDate明確提到功能仍然是實驗性的,所以我的問題是反饋比投訴更多。

爲什麼計算整數日期(IDate)類變量的時間差需要比其他日期類變量或整數長得多?

# Example data 
require(data.table) 
n <- 1e7 
dt <- data.table(x1 = sample(1000:2000, n, replace=TRUE), 
       x2 = sample(1000:2000, n, replace=TRUE)) 

# Add date variables. 
dt[, date1 := as.Date(x1, origin="1990-01-01")] 
dt[, date2 := as.Date(x2, origin="1990-01-01")] 

# Add integer-dates. 
dt[, idate1 := as.IDate(date1)] 
dt[, idate2 := as.IDate(date2)] 

# Add POSIXct dates. 
dt[, posix1 := as.POSIXct(date1)] 
dt[, posix2 := as.POSIXct(date2)][] 

# Check variable classes. 
sapply(dt[, list(x1, date1, idate1, posix1)], class) 

給人

$x1 
[1] "integer" 

$date1 
[1] "Date" 

$idate1 
[1] "IDate" "Date" 

$posix1 
[1] "POSIXct" "POSIXt" 

都很好。

現在我們來看看計算每個類的差異需要多長時間。

# Compute date diffs. 
system.time(dt[, x.diff := x1 - x2]) 
user system elapsed 
0.07 0.00 0.06 

system.time(dt[, date.diff := date1 - date2]) 
user system elapsed 
0.39 0.13 0.51 

system.time(dt[, idate.diff := idate1 - idate2]) 
user system elapsed 
6.21 0.67 6.91 

system.time(dt[, posix.diff := posix1 - posix2]) # diff in seconds 
user system elapsed 
0.20 0.09 0.30 

IDate類至少比其餘的十級的順序,令人驚訝,因爲它應該存儲爲一個整數?

# Check results are identical. 
identical(dt[, date1], dt[, idate1]) 
[1] TRUE 

日期和IDate結果是相同的。這是怎麼回事?

回答

1

我不知道爲什麼,但可以通過將IDate轉換爲整數來「修復」它。我也不知道它爲什麼修復它。我知道這不是一個答案,但更像是一個後續觀察:

> system.time(dt[, idate.diff := idate1 - idate2]) 
    user system elapsed 
    4.78 0.44 5.25 
> head(dt$idate.diff) 
Time differences in days 
[1] -620 -491 634 151 110 -338 
> system.time(dt[, idate.int.diff := as.integer(idate1) - as.integer(idate2)]) 
    user system elapsed 
    0.06 0.01 0.08 
> head(dt$idate.int.diff) 
[1] -620 -491 634 151 110 -338 
+0

這是一個很好的觀察。現在我堅持'POSIXct'。你認爲這是'IDate'中的錯誤嗎? –

+0

稍後我會檢查[data.table問題列表](https://github.com/Rdatatable/data.table/issues),看看有沒有關於它的任何信息。 – LauriK