2015-02-05 1 views
2

Чтение ?IDate казалось хорошей идеей преобразовать переменные символов в целые числа в моей довольно большой таблице данных. Кто не хочет быстрой сортировки и группировки?Difftime slow with data.table IDate в 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 

Класс Идате, по крайней мере на порядок десять медленнее, чем остальные, удивительно, как это должно быть сохранено как целое?

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

Результаты поиска Дата и идентификация идентичны. Что происходит?

ответ

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

После этого я просмотрю [список проблем с данными.] (Https://github.com/Rdatatable/data.table/issues) и посмотрю, есть ли что-нибудь в этом роде. – LauriK

 Смежные вопросы

  • Нет связанных вопросов^_^