2014-09-19 97 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)) 

在某一點上的數據變得太大,因此保持雙方或將他們所有的時間是不是真的一個很好的選擇(這不可能是真的),所以我想製作的相同方法。但是,我只找到修改通用方法的簡單例子。

是我想甚至可能的,如果是的話,我可以在哪裏讀到它?

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 2014-09-19 14:25:38

+0

@sheffien添加到帖子 – user2794728 2014-09-19 14:42:09

回答

2

修改方法添加你自己的水手很簡單:

`[.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 2014-09-22 07:46:20

+0

但是我遇到了問題。我需要使用''.data.table'的'I'部分。我這樣做''[.data.table'= function(x,I,...)',調用'data.table :::'[。data.table'(x,I,...)''如果'I'不是我需要的特定格式,但是打破'DT [x> = 0]'的呼叫' – user2794728 2014-09-22 14:04:16

+0

做了第二次編輯以解釋我做了什麼。 – user2794728 2014-09-22 14:08:18