2014-09-19 64 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