2014-09-19 2 views
3

Я много работаю с временными рядами. Большинство моих манипуляций выполняются с помощью data.table, но часто я должен проверить данные, вызываемые определенное время, и для этого я использую xts метод:Добавление нового метода в data.table

> timedata['2014-01-02/2014-01-03'] 

Мои данные data.table является в основном точная копия xts, с первых colums index, время, содержащий:

> dt_timedata <- data.table(index=index(timedata), coredata(timedata)) 

в некоторых точечных данных стал слишком большим, поэтому держать оба или преобразования их все время не очень хороший вариант (который он никогда не был на самом деле), так что я имею в виду о том, тот же метод для data.table. Тем не менее, я не мог найти никаких разумных примеров изменения общего метода.

Я хочу, чтобы это было возможно, и если да, где я мог бы прочитать об этом?

PS Несмотря на то, что я могу abviosly использовать что-то вроде

> from <- '2014-01-02' 
> to <- '2014-01-03' 
> period <- as.POSIXct(c(from, to)) 
> dt_timedata[index %between% period] 

это гораздо менее интуитивным и красиво, поэтому я предпочел бы написать новый метод.

Edit1 (например, по запросу)

require(xts) 
require(data.table) 
days <- as.POSIXct(c('2014-01-01', '2014-01-02', '2014-01-03', '2014-01-04'), origin='1970-01-01') 
timedata <- xts(1:4, days) 
dt_timedata <- data.table(index=index(timedata), coredata(timedata)) 

Что я могу сделать в xts:

> timedata['2014-01-01/2014-01-02'] 
     [,1] 
2014-01-01 1 
2014-01-02 2 

Я хочу точно такой же для [.data.table.

Edit2 (чтобы проиллюстрировать, что я делаю)

'[.data.table' = function(x, i, ...) { 
    if (!missing('i')) { 
     if (all(class(i) == "character")) { 
      # do some weird stuff 
      return(x[ *some indices subset I just created* ]) 
     } 
    } 
    data.table:::'[.data.table'(x, i, ...) 
} 

Так в основном, если i является характер и подходит мой формат (проверка происходит в странном разделе вещи) я что-то вернуть и функция никогда не переходит в последнюю команду , В противном случае ничего не происходит, и я просто называю

data.table:::'[.data.table'(x, i, ...) 

И дело, это разбивает такие выражения, как

ind <- as.POSIXct('2014-01-01', origin='1970-01-01') 
dt_timedata[index==ind] 

Вот простой пример для вас попробовать:

require(data.table) 
days <- as.POSIXct(c('2014-01-01', '2014-01-02', '2014-01-03', '2014-01-04'), origin='1970-01-01') 
dt_timedata <- data.table(index=days, value=1:4) 
ind <- as.POSIXct('2014-01-01', origin='1970-01-01') 
# now it works 
dt_timedata[index==ind] 
# new trivial [.data.table 
'[.data.table' = function(x, I, ...) { 
    data.table:::`[.data.table`(x, I, ...) 
} 
# and now it doesn't work 
dt_timedata[index==ind] 
+0

вы можете обеспечить воспроизводимый пример? – nsheff

+0

@sheffien добавил в сообщение – user2794728

ответ

2

Модификация метода для добавить свой собственный smth smth очень просто:

`[.data.table` = function(...) { 
    print("I'm doing smth custom") 
    data.table:::`[.data.table`(...) 
} 

dt = data.table(a = 1:5) 
dt[, sum(a)] 
#[1] "I'm doing smth custom" 
#[1] 15 

Итак, просто обработайте первый аргумент, как вам нравится, и подайте его на стандартную функцию.

Вот пример для обработки вашего редактирования:

`[.data.table` = function(...) { 
    if (try(class(..2), silent = TRUE) == 'character') 
    print("boo") 
    else 
    data.table:::`[.data.table`(...) 
} 

dt = data.table(a = 1:10) 
dt[a == 4] 
# a 
#1: 4 

dt['sdf'] 
#[1] "boo" 
#[1] "boo" 
+0

именно то, что я хотел. Спасибо! – user2794728

+0

Однако я столкнулся с проблемой.Мне нужно работать с 'I' частью' [.data.table'. Я делаю это как '' [.data.table '= function (x, I, ...) ', вызывая' data.table :::' [. Data.table '(x, I, ...) ' в случае, если 'I' не находится в определенном формате, который мне нужен, но это вызывает вызов типа« DT [x> = 0] » – user2794728

+0

Сделал второе редактирование, чтобы объяснить, что я делаю. – user2794728

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