向data.table添加新方法

时间:2014-09-19 13:09:44

标签: r methods data.table xts

我在时间序列方面做了很多工作。我的大多数操作都是通过data.table完成的,但我经常需要检查特定时间调用的数据,为此我使用xts方法:

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

我的data.table数据基本上是xts的完整副本,第一列index,包含时间:

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

在某些时候数据变得太大,所以保持两者或一直转换它们并不是一个很好的选择(它从来没有真正),所以我在考虑为data.table制作相同的方法。但是,我只能找到修改泛型方法的任何合理简单的例子。

我想要的是什么,如果是的话,我在哪里可以阅读它?

PS即使我可以使用像

这样的东西
> 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]

1 个答案:

答案 0 :(得分: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"